Как да коригирам java.lang.UnsupportedClassVersionError

1. Въведение

В този кратък урок ще научим какво причинява грешката при изпълнение на Java java.lang.UnsupportedClassVersionError: Неподдържана версия major.minor и как да я поправим.

2. Поглед към грешката

Нека започнем с разглеждането на примерна грешка:

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

Тази грешка ни казва, че нашият клас е компилиран в по-висока версия на Java от версията, с която се опитахме да го стартираме. По-конкретно, в този случай ние компилирахме нашия клас с Java 11 и се опитахме да го стартираме с Java 8.

2.1. Номера на версията на Java

За справка, нека да разгледаме набързо номерата на версиите на Java. Това ще бъде полезно в случай, че трябва да изтеглим подходящата версия на Java.

Номерата на главните и второстепенните версии се съхраняват в байт кода на класа в байтове шест и седем.

Нека да видим как номерата на основните версии се свързват с версиите на 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. Коригирайте чрез командния ред

Нека сега обсъдим как можем да разрешим тази грешка, когато стартираме Java от командния ред.

В зависимост от нашата ситуация имаме два начина да разрешим тази грешка: да компилираме нашия код за по-ранна версия на Java или да стартираме нашия код на по-нова версия на Java .

Окончателното решение зависи от нашата ситуация. Ако трябва да използваме библиотека на трети страни, която вече е компилирана на по-високо ниво, най-добрият вариант е вероятно да стартираме приложението си с по-нова версия на Java. Ако опаковаме приложение за разпространение, може би е най-добре да компилираме до по-стара версия.

3.1. JAVA_HOME Променлива на средата

Нека започнем с проверка как е зададена нашата променлива JAVA_HOME . Това ще ни каже кой JDK се използва, когато стартираме javac от нашия команден ред:

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

Ако сме готови да преминем изцяло към по-нова JDK, можем да изтеглим по-новата версия и да се уверим, че нашите променливи на средата PATH и JAVA_HOME са зададени по подходящ начин.

3.2. Изпълнение на нов JRE

Връщайки се към нашия пример, нека разгледаме как можем да разрешим грешката, като я стартираме в по-висока версия на Java. Ако приемем, че имаме Java 11 JRE в C: \ Apps \ jdk-11.0.2 , можем да стартираме нашия код с пакета java команда:

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

3.3. Компилиране с по-стар JDK

Ако пишем приложение, което искаме да може да се стартира до определена версия на Java, трябва да компилираме кода за тази версия.

Ние можем да направим, че в една от следните три начина: с помощта на по-стара JDK за съставяне на нашия код, като се използва -bootclasspath , -Източник и -target опции на javac команда (JDK 8 и повече години), или с помощта на -освобождаване опция (JDK 9 и по-нови).

Нека започнем с използване на по-стар JDK, подобно на начина, по който използвахме по-нов JRE за стартиране на нашия код:

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

Възможно е просто да използвате -source и -target , но все пак може да създаде файлове с класове, които не са съвместими с по-стара Java.

За да осигурим съвместимост, можем да насочим -bootclasspath към rt.jar на целевия JRE:

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

Горното се отнася главно за JDK 8 и по-ниски. В JDK 9 беше добавен параметър –release, който замества –source и –target . Опцията –release поддържа цели 6, 7, 8, 9, 10 и 11.

Нека използваме –release за насочване към Java 8:

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

Сега можем да стартираме нашия код на Java 8 или по-нова версия JRE.

4. Eclipse IDE

Сега, след като разбрахме грешката и общия подход за нейното коригиране, нека вземем наученото и да видим как можем да го приложим, когато работим в Eclipse IDE.

4.1. Промяна на JRE

Ако приемем, че Eclipse вече е конфигуриран с различни версии на Java, нека променим JRE на нашия проект.

Нека да преминем към нашите свойства на проекта , след това към Java Build Path и след това раздела Библиотеки . Веднъж там, ще изберем JRE и щракнете върху Редактиране :

Сега, нека да изберем Alternate JRE и да посочим нашата инсталация на Java 11:

На този етап нашето приложение ще работи срещу Java 11.

4.2. Промяна на нивото на компилатора

Нека сега разгледаме как можем да променим целта си на по-ниско ниво на 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.

Нека зададем източника и целта, като използваме свойствата на приставката на компилатора:

 1.8 1.8 

Като алтернатива можем да зададем източника и целта в приставката на компилатора:

  maven-compiler-plugin  1.8 1.8   

С опцията –release , добавена в Java 9, можем да конфигурираме това и с Maven.

Нека използваме свойството на приставката на компилатора, за да зададем изданието :

 8 

Или можем да конфигурираме приставката на компилатора директно:

  maven-compiler-plugin  8   

7. Заключение

В тази кратка статия научихме какво причинява java.lang.UnsupportedClassVersionError: Неподдържано съобщение за грешка на major.minor версия и как да го поправим.