Перейти к основному содержимому

Как исправить ошибку java.lang.UnsupportedClassVersionError

· 6 мин. чтения

1. Введение

В этом кратком руководстве мы узнаем, что вызывает ошибку среды выполнения Java java.lang.UnsupportedClassVersionError: Unsupported major.minor version и как ее исправить.

2. Взгляд на ошибку

Начнем с примера ошибки:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/foreach/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 = Ява 5
  • 50 = Ява 6
  • 51 = Ява 7
  • 52 = Ява 8
  • 53 = Ява 9
  • 54 = Ява 10
  • 55 = Ява 11
  • 56 = Ява 12
  • 57 = Ява 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.foreach.MajorMinorApp
Hello World!

3.3. Компиляция со старым JDK

Если мы пишем приложение, которое мы хотим запустить до определенной версии Java, нам нужно скомпилировать код для этой версии.

Мы можем сделать это одним из трех способов: используя более старый JDK для компиляции нашего кода; используя параметры -bootclasspath , -source и -target команды javac (JDK 8 и старше); или с помощью параметра –release (JDK 9 и новее).

Давайте начнем с использования более старого JDK, аналогично тому, как мы использовали более новый JRE для запуска нашего кода:

C:\Apps\Java\jdk1.8.0_31\bin\javac com/foreach/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/foreach/MajorMinorApp.java

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

Давайте используем –release для Java 8:

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

Теперь мы можем запустить наш код на Java 8 или выше JRE.

4. Затмение IDE

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

4.1. Изменение JRE

Предполагая, что у нас уже настроен Eclipse с различными версиями Java , давайте изменим JRE нашего проекта.

Перейдем в свойства нашего проекта , затем в Java Build Path , а затем во вкладку Libraries . Оказавшись там, мы выберем JRE и нажмем « Изменить » :

./61aa7c0917f491371e1f00d1ac9d06d9.jpg

Теперь давайте выберем Alternate JRE и укажем нашу установку Java 11:

./cd1306ff9bf284db410b847ee3495eec.jpg

На этом этапе наше приложение будет работать с Java 11.

4.2. Изменение уровня компилятора

Теперь давайте посмотрим, как мы можем изменить нашу цель на более низкий уровень Java.

Во-первых, давайте вернемся к свойствам нашего проекта , затем к компилятору Java , а затем поставим галочку напротив Enable projectspecific settings :

./61799b970b4012c3acadae0007346fbf.jpg

Здесь мы можем настроить наш проект на компиляцию для более ранних версий Java и настроить другие параметры соответствия:

./821ebeb40c454e738bcb62007927b9eb.jpg

5. IntelliJ ИДЕЯ

Мы также можем контролировать версию Java, используемую для компиляции и запуска в IntelliJ IDEA.

5.1. Добавление JDK

Прежде чем мы это сделаем, мы увидим, как добавить дополнительные JDK. Перейдем в Файл -> Структура проекта -> Настройки платформы -> SDK :

./394c596cce3303090068f6f994e62c3d.jpg

Давайте щелкнем значок плюса в среднем столбце, выберем JDK из раскрывающегося списка и выберем расположение нашего JDK:

./61621f4c2acac1c3d38eefc41c779cdc.jpg

5.2. Изменение JRE

Во-первых, мы рассмотрим, как использовать IDEA для запуска нашего проекта в более новой версии JRE.

Перейдем к Run -> Edit Configurations… и изменим нашу JRE на 11:

./4afc9e5bb67ccf262644e15bdaafa536.jpg

Теперь, когда мы запускаем наш проект, он будет работать с Java 11 JRE.

5.3. Изменение уровня компилятора

Если мы распространяем наше приложение для работы на более низкой версии JRE, нам нужно настроить уровень нашего компилятора, чтобы он ориентировался на более старую версию Java.

Перейдем в File -> Project Structure… -> Project Settings -> Project и изменим наш Project SDK и уровень языка Project :

./204e642ce8b7f4f51440cbf41b46c512.jpg

Теперь мы можем собрать наш проект, и сгенерированные файлы классов будут работать на Java 8 и выше.

6. Мавен

Когда мы создаем и упаковываем файл в Maven , мы можем управлять целевой версией Java .

При использовании Java 8 или старше мы устанавливаем источник и цель для подключаемого модуля компилятора.

Давайте установим источник и цель, используя свойства плагина компилятора:

<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>

В качестве альтернативы мы можем установить источник и цель в плагине компилятора:

<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>

С опцией –release , добавленной в Java 9, мы также можем настроить ее с помощью Maven.

Давайте используем свойство плагина компилятора, чтобы установить выпуск :

<properties>
<maven.compiler.release>8</maven.compiler.release>
</properties>

Или мы можем настроить плагин компилятора напрямую:

<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>8</release>
</configuration>
</plugin>
</plugins>

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

В этой статье мы узнали, что вызывает сообщение об ошибке java.lang.UnsupportedClassVersionError: Unsupported major.minor version и как это исправить.