Cách sửa lỗi java.lang.UnsupportedClassVersionError

1. Giới thiệu

Trong hướng dẫn ngắn này, chúng ta sẽ tìm hiểu nguyên nhân gây ra lỗi thời gian chạy Java java.lang.UnsupportedClassVersionError: Phiên bản major.minor không được hỗ trợ và cách khắc phục nó.

2. Xem xét lỗi

Hãy bắt đầu bằng cách xem một lỗi ví dụ:

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

Lỗi này cho chúng tôi biết rằng lớp của chúng tôi đã được biên dịch ở phiên bản Java cao hơn phiên bản mà chúng tôi đã cố gắng chạy nó. Cụ thể hơn, trong trường hợp này, chúng tôi đã biên dịch lớp của mình với Java 11 và cố gắng chạy nó với Java 8.

2.1. Số phiên bản Java

Để tham khảo, chúng ta hãy xem nhanh các số phiên bản Java. Điều này sẽ hữu ích trong trường hợp chúng ta cần tải xuống phiên bản Java thích hợp.

Số phiên bản chính và phụ được lưu trữ trong mã byte lớp ở byte sáu và bảy.

Hãy xem cách các số phiên bản chính liên kết với các phiên bản Java:

  • 45 = Java 1.1
  • 46 = Java 1.2
  • 47 = Java 1.3
  • 48 = Java 1.4
  • 49 = Java 5
  • 50 = Java 6
  • 51 = Java 7
  • 52 = Java 8
  • 53 = Java 9
  • 54 = Java 10
  • 55 = Java 11
  • 56 = Java 12
  • 57 = Java 13

3. Khắc phục thông qua Dòng lệnh

Bây giờ chúng ta hãy thảo luận về cách chúng ta có thể giải quyết lỗi này khi chạy Java từ dòng lệnh.

Tùy thuộc vào tình huống của chúng tôi, chúng tôi có hai cách để giải quyết lỗi này: biên dịch mã của chúng tôi cho phiên bản Java cũ hơn hoặc chạy mã của chúng tôi trên phiên bản Java mới hơn .

Quyết định cuối cùng phụ thuộc vào tình hình của chúng tôi. Nếu chúng ta cần sử dụng thư viện của bên thứ ba đã được biên dịch ở cấp độ cao hơn, thì lựa chọn tốt nhất của chúng ta có lẽ là chạy ứng dụng của mình bằng phiên bản Java mới hơn. Nếu chúng tôi đang đóng gói một ứng dụng để phân phối, tốt nhất có thể là biên dịch xuống phiên bản cũ hơn.

3.1. Biến môi trường JAVA_HOME

Hãy bắt đầu bằng cách kiểm tra cách đặt biến JAVA_HOME của chúng ta . Điều này sẽ cho chúng tôi biết JDK nào đang được sử dụng khi chúng tôi chạy javac từ dòng lệnh của mình:

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

Nếu chúng tôi đã sẵn sàng chuyển hoàn toàn sang JDK mới hơn, chúng tôi có thể tải xuống phiên bản mới hơn và đảm bảo các biến môi trường PATHJAVA_HOME của chúng tôi được đặt phù hợp.

3.2. Chạy JRE mới

Quay lại ví dụ của chúng ta, hãy xem cách chúng ta có thể giải quyết lỗi bằng cách chạy nó ở phiên bản Java cao hơn. Giả sử chúng ta có Java 11 JRE trong C: \ Apps \ jdk-11.0.2 , chúng ta có thể chạy mã của mình bằng lệnh java được đóng gói với nó:

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

3.3. Biên dịch với JDK cũ hơn

Nếu chúng tôi đang viết một ứng dụng mà chúng tôi muốn có thể chạy được xuống một phiên bản Java nhất định, chúng tôi cần biên dịch mã cho phiên bản đó.

Chúng ta có thể làm điều đó theo một trong ba cách sau: sử dụng một JDK cũ để biên dịch mã của chúng tôi, bằng cách sử dụng bootclasspath , -source , và -target tùy chọn của javac lệnh (JDK 8 tuổi trở lên), hoặc sử dụng -release tùy chọn (JDK 9 và mới hơn).

Hãy bắt đầu bằng cách sử dụng JDK cũ hơn, tương tự như cách chúng tôi sử dụng JRE mới hơn để chạy mã của mình:

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

Có thể chỉ sử dụng -source-target , nhưng nó vẫn có thể tạo các tệp lớp không tương thích với Java cũ hơn.

Để đảm bảo tính tương thích, chúng tôi có thể trỏ -bootclasspath tại rt.jar của JRE được nhắm mục tiêu:

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

Những điều trên áp dụng chủ yếu cho JDK 8 trở xuống. Trong JDK 9, tham số –release đã được thêm vào để thay thế -source-target . Các -release tùy chọn hỗ trợ mục tiêu 6, 7, 8, 9, 10, và 11.

Hãy sử dụng –release để nhắm mục tiêu Java 8:

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

Bây giờ chúng ta có thể chạy mã của mình trên Java 8 hoặc JRE cao hơn.

4. IDE Eclipse

Bây giờ chúng ta đã hiểu về lỗi và cách tiếp cận chung để sửa nó, hãy xem những gì chúng ta đã học được và xem cách chúng ta có thể áp dụng nó khi làm việc trong IDE Eclipse.

4.1. Thay đổi JRE

Giả sử chúng ta đã cấu hình Eclipse với các phiên bản Java khác nhau, hãy thay đổi JRE của dự án.

Hãy chuyển đến thuộc tính Dự án của chúng ta , sau đó đến Đường dẫn xây dựng Java và sau đó là tab Thư viện . Khi đó, chúng tôi sẽ chọn JRE và nhấp vào Chỉnh sửa :

Bây giờ, hãy chọn JRE thay thế và trỏ đến cài đặt Java 11 của chúng tôi:

Tại thời điểm này, ứng dụng của chúng tôi sẽ chạy trên Java 11.

4.2. Thay đổi mức trình biên dịch

Bây giờ chúng ta hãy xem cách chúng ta có thể thay đổi mục tiêu của mình xuống cấp độ Java thấp hơn.

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.

Hãy đặt nguồn và đích bằng cách sử dụng các thuộc tính plugin của trình biên dịch:

 1.8 1.8 

Ngoài ra, chúng ta có thể đặt nguồn và đích trong plugin trình biên dịch:

  maven-compiler-plugin  1.8 1.8   

Với tùy chọn –release được thêm vào trong Java 9, chúng ta cũng có thể cấu hình nó với Maven.

Hãy sử dụng thuộc tính plugin trình biên dịch để đặt bản phát hành :

 8 

Hoặc chúng ta có thể định cấu hình trực tiếp plugin trình biên dịch:

  maven-compiler-plugin  8   

7. Kết luận

Trong bài viết ngắn này, chúng tôi đã tìm hiểu nguyên nhân gây ra thông báo lỗi java.lang.UnsupportedClassVersionError: Unsupported major.minor phiên bản và cách khắc phục nó.