Cara Memperbaiki java.lang.UnsupportedClassVersionError

1. Perkenalan

Dalam tutorial singkat ini, kita akan mempelajari apa yang menyebabkan error runtime Java java.lang.UnsupportedClassVersionError: Versi major.minor tidak didukung dan cara memperbaikinya.

2. Lihat Error tersebut

Mari kita mulai dengan melihat contoh kesalahan:

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 memberi tahu kami bahwa kelas kami dikompilasi pada versi Java yang lebih tinggi daripada versi yang kami coba jalankan. Lebih khusus lagi, dalam kasus ini, kami mengkompilasi kelas kami dengan Java 11 dan mencoba menjalankannya dengan Java 8.

2.1. Nomor Versi Java

Sebagai referensi, mari kita lihat nomor versi Java. Ini akan berguna jika kita perlu mengunduh versi Java yang sesuai.

Nomor versi mayor dan minor disimpan dalam bytecode kelas pada byte enam dan tujuh.

Mari kita lihat bagaimana peta nomor versi utama 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 = Jawa 7
  • 52 = Java 8
  • 53 = Jawa 9
  • 54 = Java 10
  • 55 = Jawa 11
  • 56 = Jawa 12
  • 57 = Jawa 13

3. Perbaiki melalui Command Line

Sekarang mari kita bahas bagaimana kita dapat mengatasi kesalahan ini saat menjalankan Java dari baris perintah.

Bergantung pada situasi kita , kita memiliki dua cara untuk mengatasi kesalahan ini: mengkompilasi kode kita untuk versi Java yang lebih lama, atau menjalankan kode kita pada versi Java yang lebih baru .

Keputusan akhir tergantung pada situasi kita. Jika kita perlu menggunakan pustaka pihak ketiga yang sudah dikompilasi di tingkat yang lebih tinggi, opsi terbaik kita mungkin adalah menjalankan aplikasi kita menggunakan versi Java yang lebih baru. Jika kita mengemas aplikasi untuk distribusi, mungkin yang terbaik adalah mengkompilasi ke versi yang lebih lama.

3.1. Variabel Lingkungan JAVA_HOME

Mari kita mulai dengan memeriksa bagaimana variabel JAVA_HOME kita disetel. Ini akan memberi tahu kami JDK mana yang digunakan ketika kami menjalankan javac dari baris perintah kami:

echo %JAVA_HOME% C:\Apps\Java\jdk8-x64

Jika kami siap untuk pindah sepenuhnya ke JDK yang lebih baru, kami dapat mengunduh versi yang lebih baru dan memastikan variabel lingkungan PATH dan JAVA_HOME kami disetel dengan tepat.

3.2. Menjalankan JRE Baru

Kembali ke contoh kita, mari kita lihat bagaimana kita dapat mengatasi kesalahan dengan menjalankannya di versi Java yang lebih tinggi. Dengan asumsi kita memiliki Java 11 JRE di C: \ Apps \ jdk-11.0.2 , kita dapat menjalankan kode kita dengan perintah java yang dikemas dengannya:

C:\Apps\jdk-11.0.2\bin\java com.baeldung.MajorMinorApp Hello World!

3.3. Mengompilasi dengan JDK yang Lebih Lama

Jika kita sedang menulis aplikasi yang ingin dijalankan ke versi Java tertentu, kita perlu mengkompilasi kode untuk versi itu.

Kita dapat melakukannya dengan salah satu dari tiga cara: menggunakan JDK yang lebih lama untuk mengompilasi kode kita, menggunakan opsi -bootclasspath , -source , dan -target dari perintah javac (JDK 8 dan yang lebih lama), atau menggunakan opsi –release (JDK 9 dan lebih baru).

Let's start by using an older JDK, similarly to how we used a newer JRE for running our code:

C:\Apps\Java\jdk1.8.0_31\bin\javac com/baeldung/MajorMinorApp.java

It's possible to just use -source and -target, but it might still create class files that aren't compatible with an older Java.

To ensure compatibility, we can point -bootclasspath at the rt.jar of the targeted JRE:

javac -bootclasspath "C:\Apps\Java\jdk1.8.0_31\jre\lib\rt.jar" \ -source 1.8 -target 1.8 com/baeldung/MajorMinorApp.java

The above applies mainly to JDK 8 and lower. In JDK 9, the –release parameter was added to replace -source and -target. The –release option supports targets 6, 7, 8, 9, 10, and 11.

Let's use –release to target Java 8:

javac --release 8 com/baeldung/MajorMinorApp.java

Now we can run our code on a Java 8 or higher JRE.

4. Eclipse IDE

Now that we understand the error and the general approach to correcting it, let's take what we've learned and see how we can apply it when working in the Eclipse IDE.

4.1. Changing the JRE

Assuming we already have Eclipse configured with different versions of Java, let's change our project's JRE.

Let's go to our Project properties, then to Java Build Path, and then the Libraries tab. Once there, we'll select the JRE and click Edit:

Now, let's choose Alternate JRE and point to our Java 11 installation:

At this point, our application will run against Java 11.

4.2. Changing the Compiler Level

Let's now look at how we can change our target to a lower level of Java.

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 target menggunakan properti plugin compiler:

 1.8 1.8 

Alternatifnya, kita dapat mengatur sumber dan target di plugin compiler:

  maven-compiler-plugin  1.8 1.8   

Dengan opsi –release yang ditambahkan di Java 9, kita bisa mengkonfigurasinya dengan Maven juga.

Mari gunakan properti plugin compiler untuk menyetel rilis :

 8 

Atau kita bisa mengkonfigurasi plugin compiler secara langsung:

  maven-compiler-plugin  8   

7. Kesimpulan

Dalam artikel singkat ini, kita mempelajari apa yang menyebabkan pesan kesalahan versi java.lang.UnsupportedClassVersionError: Unsupported major.minor , dan cara memperbaikinya.