- Как исправить ошибку java.lang.UnsupportedClassVersionError
- 2. Взгляните на ошибку
- 2.1. Номера версий Java
- 3. Исправить через командную строку
- 3.1. Переменная среды JAVA_HOME
- 3.2. Запуск новой JRE
- 3.3. Компиляция с использованием более старой версии JDK
- 4. Eclipse IDE
- 4.1. Изменение JRE
- 4.2. Изменение уровня компилятора
- 5. IntelliJ IDEA
- 5.1. Adding a JDK
- 5.2. Changing the JRE
- 5.3. Changing the Compiler Level
- 6. Maven
- 7. Заключение
- Популярные посты
- Помогите пожалуйста! Я
Как исправить ошибку java.lang.UnsupportedClassVersionError
В этом коротком руководстве мы узнаем, что вызывает ошибку времени выполнения 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 , -source и -target опционов JAVAC команды (JDK 8 и старше), или с помощью -release вариант (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 , а затем на вкладку Libraries . Оказавшись там, мы выберем JRE и нажмем Edit :
Теперь давайте выберем альтернативную 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.
Давайте установим источник и цель, используя свойства плагина компилятора:
В качестве альтернативы мы можем установить источник и цель в плагине компилятора:
maven-compiler-plugin 1.8 1.8
С помощью опции –release, добавленной в Java 9, мы также можем настроить ее с помощью Maven.
Давайте используем свойство плагина компилятора, чтобы установить выпуск :
Или мы можем настроить плагин компилятора напрямую:
7. Заключение
В этой короткой статье мы узнали, что вызывает сообщение об ошибке java.lang.UnsupportedClassVersionError: Unsupported major.minor version , и как это исправить.
Популярные посты
Помогите пожалуйста! Я
C:\Users\brozi\Desktop\ggfg>java -Dfile.encoding=UTF-8 -server -jar spigot-1.19.2.jar
Exception in thread «main» java.lang.UnsupportedClassVersionError: org/bukkit/craftbukkit/bootstrap/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security .SecureClassLoader.defineClass(Unknown Source)
at java.net .URLClassLoader.defineClass(Unknown Source)
at java.net .URLClassLoader.access$100(Unknown Source)
at java.net .URLClassLoader$1.run(Unknown Source)
at java.net .URLClassLoader$1.run(Unknown Source)
at java.security .AccessController.doPrivileged(Native Method)
at java.net .URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
C:\Users\brozi\Desktop\ggfg>PAUSE
Для продолжения нажмите любую клавишу . . .
(Нажимаешь оно закрывается и папка eula не появляется)
Ошибка «java.lang.UnsupportedClassVersionError» возникает, когда вы пытаетесь запустить программу, скомпилированную с более новой версией Java Runtime, чем та, которая у вас установлена на компьютере.
В вашем случае, сообщение об ошибке говорит о том, что файл «org/bukkit/craftbukkit/bootstrap/Main» был скомпилирован с более новой версией Java Runtime (версия 61.0), чем та, которая установлена на вашем компьютере (версия 52.0).
Чтобы решить эту проблему, вам нужно установить более новую версию Java Runtime на свой компьютер. Вы можете загрузить ее с официального сайта Oracle.
Кроме того, убедитесь, что вы используете правильную версию Spigot, которая совместима с установленной версией Java Runtime. Если вы используете устаревшую версию Spigot, попробуйте обновить ее до более новой версии.
Относительно отсутствия папки «eula», проверьте, была ли она создана после запуска сервера. Если нет, то создайте папку вручную и добавьте в нее файл «eula.txt» со следующим содержимым: «eula=true». Это поможет вам принять пользовательское соглашение перед запуском сервера.