- Как исправить ошибку java.lang.UnsupportedClassVersionError
- 2. Взгляд на ошибку
- 2.1. Номера версий Java
- 3. Исправление через командную строку
- 3.1. Переменная среды JAVA_HOME
- 3.2. Запуск новой JRE
- 3.3. Компиляция со старым JDK
- 4. Затмение IDE
- 4.1. Изменение JRE
- 4.2. Изменение уровня компилятора
- 5. IntelliJ ИДЕЯ
- 5.1. Добавление JDK
- 5.2. Изменение JRE
- 5.3. Изменение уровня компилятора
- 6. Мавен
- 7. Заключение
- Saved searches
- Use saved searches to filter your results more quickly
- Java Runtime only recognizes class file versions up to 52.0 #461
- Java Runtime only recognizes class file versions up to 52.0 #461
- Comments
Как исправить ошибку java.lang.UnsupportedClassVersionError
В этом кратком руководстве мы узнаем, что вызывает ошибку среды выполнения 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.8maven.compiler.target> maven.compiler.source>1.8maven.compiler.source> properties>
В качестве альтернативы мы можем установить источник и цель в плагине компилятора:
plugins> plugin> artifactId>maven-compiler-pluginartifactId> configuration> source>1.8source> target>1.8target> configuration> plugin> plugins>
С опцией –release , добавленной в Java 9, мы также можем настроить ее с помощью Maven.
Давайте используем свойство плагина компилятора, чтобы установить выпуск :
properties> maven.compiler.release>8maven.compiler.release> properties>
Или мы можем настроить плагин компилятора напрямую:
plugins> plugin> artifactId>maven-compiler-pluginartifactId> configuration> release>8release> configuration> plugin> plugins>
7. Заключение
В этой статье мы узнали, что вызывает сообщение об ошибке java.lang.UnsupportedClassVersionError: Unsupported major.minor version и как это исправить.
- 1. Введение
- 2. Взгляд на ошибку
- 2.1. Номера версий Java
- 3.1. Переменная среды JAVA_HOME
- 3.2. Запуск новой JRE
- 3.3. Компиляция со старым JDK
- 4.1. Изменение JRE
- 4.2. Изменение уровня компилятора
- 5.1. Добавление JDK
- 5.2. Изменение JRE
- 5.3. Изменение уровня компилятора
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Java Runtime only recognizes class file versions up to 52.0 #461
Java Runtime only recognizes class file versions up to 52.0 #461
Comments
I am using OpenJDK-16 and when try to use signal-cli receive this message:
/opt/signal-cli/0.7.4/bin/signal-cli
Error: A JNI error has occurred, please check your installation and try again
Exception in thread «main» java.lang.UnsupportedClassVersionError: org/asamk/signal/Main 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
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)The text was updated successfully, but these errors were encountered: