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 и нажмем « Изменить
» :
Теперь давайте выберем Alternate JRE
и укажем нашу установку Java 11:
На этом этапе наше приложение будет работать с Java 11.
4.2. Изменение уровня компилятора
Теперь давайте посмотрим, как мы можем изменить нашу цель на более низкий уровень Java.
Во-первых, давайте вернемся к свойствам нашего проекта
, затем к компилятору Java
, а затем поставим галочку напротив Enable projectspecific settings
:
Здесь мы можем настроить наш проект на компиляцию для более ранних версий Java и настроить другие параметры соответствия:
5. IntelliJ ИДЕЯ
Мы также можем контролировать версию Java, используемую для компиляции и запуска в IntelliJ IDEA.
5.1. Добавление JDK
Прежде чем мы это сделаем, мы увидим, как добавить дополнительные JDK. Перейдем в Файл -> Структура проекта -> Настройки платформы -> SDK
:
Давайте щелкнем значок плюса в среднем столбце, выберем JDK
из раскрывающегося списка и выберем расположение нашего JDK:
5.2. Изменение JRE
Во-первых, мы рассмотрим, как использовать IDEA для запуска нашего проекта в более новой версии JRE.
Перейдем к Run -> Edit Configurations…
и изменим нашу JRE
на 11:
Теперь, когда мы запускаем наш проект, он будет работать с Java 11 JRE.
5.3. Изменение уровня компилятора
Если мы распространяем наше приложение для работы на более низкой версии JRE, нам нужно настроить уровень нашего компилятора, чтобы он ориентировался на более старую версию Java.
Перейдем в File -> Project Structure… -> Project Settings -> Project
и изменим наш Project SDK
и уровень языка Project
:
Теперь мы можем собрать наш проект, и сгенерированные файлы классов будут работать на 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 и как это исправить.