1. Pengenalan
Dalam tutorial ringkas ini, kita akan mempelajari apa yang menyebabkan ralat runtime Java java.lang.UnsupportedClassVersionError: Versi major.minor yang tidak disokong dan cara memperbaikinya.
2. Melihat Ralat
Mari mulakan dengan melihat ralat contoh:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/baeldung/MajorMinorApp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
Kesalahan ini memberitahu bahawa kelas kami disusun pada versi Java yang lebih tinggi daripada versi yang kami gunakan untuk menjalankannya. Lebih khusus lagi, dalam kes ini, kami menyusun kelas kami dengan Java 11 dan mencuba menjalankannya dengan Java 8.
2.1. Nombor Versi Java
Sebagai rujukan, mari kita lihat nombor versi Java dengan cepat. Ini akan sangat berguna sekiranya kita perlu memuat turun versi Java yang sesuai.
Nombor versi utama dan kecil disimpan dalam kod bytek kelas pada bait enam dan tujuh.
Mari lihat bagaimana nombor versi utama memetakan ke versi Java:
- 45 = Java 1.1
- 46 = Java 1.2
- 47 = Java 1.3
- 48 = Java 1.4
- 49 = Jawa 5
- 50 = Java 6
- 51 = Java 7
- 52 = Java 8
- 53 = Java 9
- 54 = Java 10
- 55 = Java 11
- 56 = Jawa 12
- 57 = Jawa 13
3. Perbaiki melalui Command Line
Sekarang mari kita bincangkan bagaimana kita dapat menyelesaikan ralat ini ketika menjalankan Java dari baris perintah.
Bergantung pada situasi kita , kita mempunyai dua cara untuk menyelesaikan ralat ini: menyusun kod kita untuk versi Java yang lebih lama, atau menjalankan kod kita pada versi Java yang lebih baru .
Keputusan akhir bergantung pada keadaan kita. Sekiranya kita perlu menggunakan perpustakaan pihak ketiga yang sudah dikompilasi pada tahap yang lebih tinggi, pilihan terbaik kita adalah menjalankan aplikasi kita menggunakan versi Java yang lebih baru. Sekiranya kami mengemas aplikasi untuk diedarkan, mungkin lebih baik dikompilasi ke versi yang lebih lama.
3.1. JAVA_HOME Pembolehubah Persekitaran
Mari mulakan dengan memeriksa bagaimana pemboleh ubah JAVA_HOME kami ditetapkan. Ini akan memberitahu kita JDK mana yang digunakan ketika kita menjalankan javac dari baris perintah kita:
echo %JAVA_HOME% C:\Apps\Java\jdk8-x64
Sekiranya kita bersedia untuk berpindah sepenuhnya ke JDK yang lebih baru, kita boleh memuat turun versi yang lebih baru dan memastikan pemboleh ubah persekitaran PATH dan JAVA_HOME kita disetel dengan betul.
3.2. Menjalankan JRE Baru
Kembali ke contoh kita, mari kita lihat bagaimana kita dapat menyelesaikan ralat dengan menjalankannya di versi Java yang lebih tinggi. Dengan andaian kita memiliki Java 11 JRE di C: \ Apps \ jdk-11.0.2 , kita dapat menjalankan kod kita dengan perintah java yang dibungkus dengannya:
C:\Apps\jdk-11.0.2\bin\java com.baeldung.MajorMinorApp Hello World!
3.3. Menyusun dengan JDK yang Lebih Lama
Sekiranya kita menulis aplikasi yang ingin kita jalankan ke versi Java tertentu, kita perlu menyusun kod untuk versi tersebut.
Kami boleh melakukannya dalam salah satu daripada tiga cara: menggunakan JDK lebih tua untuk menyusun kod kami, dengan menggunakan -bootclasspath , -Sumber dan -target pilihan daripada javac arahan (JDK 8 dan lebih tua), atau menggunakan -release pilihan (JDK 9 dan lebih baru).
Mari kita mulakan dengan menggunakan JDK yang lebih tua, sama seperti bagaimana kita menggunakan JRE yang lebih baru untuk menjalankan kod kami:
C:\Apps\Java\jdk1.8.0_31\bin\javac com/baeldung/MajorMinorApp.java
Mungkin hanya menggunakan -source dan -target , tetapi mungkin masih membuat fail kelas yang tidak serasi dengan Java yang lebih lama.
Untuk memastikan keserasian, kita dapat menunjukkan -bootclasspath di rt.jar JRE yang disasarkan:
javac -bootclasspath "C:\Apps\Java\jdk1.8.0_31\jre\lib\rt.jar" \ -source 1.8 -target 1.8 com/baeldung/MajorMinorApp.java
Perkara di atas berlaku terutamanya untuk JDK 8 dan lebih rendah. Dalam JDK 9, -release parameter telah ditambah untuk menggantikan -Sumber dan -target . Pilihan –rilis memberikan sasaran 6, 7, 8, 9, 10, dan 11.
Mari gunakan –rilis untuk menargetkan Java 8:
javac --release 8 com/baeldung/MajorMinorApp.java
Sekarang kita boleh menjalankan kod kita pada JRE Java 8 atau lebih tinggi.
4. Eclipse IDE
Setelah memahami ralat dan pendekatan umum untuk membetulkannya, mari ambil apa yang telah kita pelajari dan lihat bagaimana kita dapat menerapkannya semasa bekerja di Eclipse IDE.
4.1. Menukar JRE
Dengan andaian kita sudah mengkonfigurasi Eclipse dengan versi Java yang berlainan, mari ubah JRE projek kita.
Mari pergi ke sifat Projek kami , kemudian ke Java Build Path , dan kemudian tab Perpustakaan . Setelah sampai di sana, kami akan memilih JRE dan klik Edit :

Sekarang, mari pilih JRE Alternatif dan arahkan ke pemasangan Java 11 kami:

Pada ketika ini, aplikasi kita akan berjalan melawan Java 11.
4.2. Menukar Tahap Penyusun
Sekarang mari kita lihat bagaimana kita dapat mengubah sasaran kita ke tingkat Java yang lebih rendah.
First, let's go back to our Project properties, then Java Compiler, and check Enable project specific settings:

Here, we can set our project to compile for earlier versions of Java and customize other compliance settings:

5. IntelliJ IDEA
We can also control the version of Java we're using for compiling and running in IntelliJ IDEA.
5.1. Adding a JDK
Before we do that, we'll see how to add additional JDKs. Let's go to File -> Project Structure -> Platform Settings -> SDKs:

Let's click the plus icon in the middle column, select the JDK from the drop-down, and select our JDK location:

5.2. Changing the JRE
First, we'll look at how to use IDEA to run our project on the newer JRE.
Let's go to Run -> Edit Configurations… and change our JRE to 11:

Now, when we run our project, it will run with the Java 11 JRE.
5.3. Changing the Compiler Level
If we're distributing our application to run on a lower JRE, we need to adjust our compiler level to target the older version of Java.
Let's go to File -> Project Structure… -> Project Settings -> Project and change our Project SDK and Project language level:

We can now build our project, and the class files generated will run on Java 8 and higher.
6. Maven
When we build and package a file in Maven, we can control the version of Java we target.
When using Java 8 or older, we set the source and target for the compiler plugin.
Mari tetapkan sumber dan sasaran menggunakan sifat pemalam penyusun:
1.8 1.8
Sebagai alternatif, kita boleh menetapkan sumber dan sasaran dalam pemalam penyusun:
maven-compiler-plugin 1.8 1.8
Dengan pilihan –release yang ditambahkan di Java 9, kita dapat mengkonfigurasinya dengan Maven juga.
Mari gunakan sifat pemalam penyusun untuk menetapkan pelepasan :
8
Atau kita boleh mengkonfigurasi pemalam penyusun secara langsung:
maven-compiler-plugin 8
7. Kesimpulannya
Dalam artikel pendek ini, kami mengetahui apa yang menyebabkan java.lang.UnsupportedClassVersionError: Mesej ralat versi major.minor yang tidak disokong , dan cara memperbaikinya.