«1. Введение
В этом кратком руководстве мы узнаем, что вызывает ошибку времени выполнения Java java.lang.UnsupportedClassVersionError: Unsupported major.minor version и как ее исправить.
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, -source и -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, а затем к вкладке «Библиотеки». Оказавшись там, мы выберем JRE и нажмем Edit:
Теперь давайте выберем Alternate JRE и укажем нашу установку Java 11:
На этом этапе наше приложение будет работать с Java 11.
4.2. Изменение уровня компилятора
«Теперь давайте посмотрим, как мы можем изменить нашу цель на более низкий уровень Java.
Во-первых, вернемся к свойствам нашего проекта, затем к компилятору Java, а затем отметим Включить определенные параметры проекта:
Здесь мы можем настроить наш проект на компиляцию для более ранних версий Java и настроить другие параметры соответствия:
5. IntelliJ IDEA
Мы также можем контролировать версию Java, используемую для компиляции и запуска в IntelliJ IDEA.
5.1. Добавление JDK
Прежде чем мы это сделаем, мы посмотрим, как добавить дополнительные JDK. Перейдем в Файл -\u003e Структура проекта -\u003e Настройки платформы -\u003e SDK:
Щелкнем по значку плюса в средней колонке, выберем JDK из раскрывающегося списка и выберем расположение нашего JDK:
5.2. Изменение JRE
Сначала мы рассмотрим, как использовать IDEA для запуска нашего проекта в более новой JRE.
Перейдем к Run -\u003e Edit Configurations… и изменим нашу JRE на 11:
Теперь, когда мы запустим наш проект, он будет работать с Java 11 JRE.
5.3. Изменение уровня компилятора
Если мы распространяем наше приложение для работы на JRE более низкого уровня, нам нужно настроить уровень нашего компилятора, чтобы ориентироваться на более старую версию Java.
Давайте перейдем в Файл -\u003e Структура проекта… -\u003e Настройки проекта -\u003e Проект и изменим SDK нашего проекта и уровень языка проекта:
Теперь мы можем собрать наш проект, и сгенерированные файлы классов будут работать на Java 8. и выше.
6. Maven
Когда мы собираем и упаковываем файл в 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>
С опцией –релиза, добавленной в 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: сообщение об ошибке неподдерживаемой основной.дополнительной версии и способы ее исправления.