Рубрики
Без рубрики

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

Узнайте, что вызывает “java.lang.Ошибка UnsupportedClassVersionError: Неподдерживаемая ошибка основной.второстепенной версии” сообщение и способы ее исправления.

Автор оригинала: Amy DeGregorio.

1. введение

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

Дальнейшее чтение:

Не удалось найти или загрузить основную ошибку класса

Ошибка компилятора Java: “ожидаемый класс, интерфейс или перечисление”

Причины и предотвращение java.lang.Ошибка проверки

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 1.1
  • 46 1.2
  • 47 1.3
  • 48 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 , мы можем загрузить более новую версию и убедиться, что наши ПУТЬ и Переменные среды 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 , -исходный и -целевой параметры команды javac (JDK 8 и старше); или используя параметр –release (JDK 9 и новее).

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

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

Можно просто использовать -исходный код и -целевой , но это все равно может привести к созданию файлов классов, несовместимых со старой 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 был добавлен для замены -источника и -цели . Опция –выпуск поддерживает целевые объекты 6, 7, 8, 9, 10, и 11.

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

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

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

4. Среда разработки Eclipse

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

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

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

Давайте перейдем к вашим Свойствам проекта , затем Пути сборки Java , а затем на вкладку Библиотеки . Оказавшись там, мы выберем JRE и нажмем Редактировать :

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

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

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

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

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

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

5. ИДЕЯ IntelliJ

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

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

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

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

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

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

Давайте перейдем в Выполнить -> Редактировать конфигурации… и измените наш JRE на 11:

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

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

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

Давайте перейдем в Файл -> Структура проекта… -> Настройки проекта -> Проект и изменим наш SDK проекта и Уровень языка проекта :

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

6. Maven

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

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

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


    1.8
    1.8

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


        
        maven-compiler-plugin
        
            1.8
            1.8
        
    

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

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


    8

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


        
        maven-compiler-plugin
        
            8
        
    

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

В этой статье мы узнали, что вызывает java.lang.Ошибка UnsupportedClassVersionError: Неподдерживаемая основная.второстепенная версия сообщение об ошибке и способы ее исправления.