Как исправить ошибку java.lang.UnsupportedClassVersionError: Неподдерживаемая версия major.minor
Я пытаюсь использовать Notepad++ в качестве инструмента "все в одном" для редактирования, запуска, компиляции и т. Д.
У меня установлена JRE, и я установил переменную пути в каталог.../bin.
Когда я запускаю "Hello world" в Notepad++, я получаю следующее сообщение:
java.lang.UnsupportedClassVersionError: test_hello_world :
Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
.........................................
Я думаю, что проблема здесь в версиях; какая-то версия Java может быть старой или слишком новой.
- Как мне это исправить?
- Должен ли я установить JDK и установить переменную пути в JDK вместо JRE?
- В чем разница между
PATH
переменная в JRE или JDK?
53 ответа
Показанный номер версии описывает версию JRE, с которой совместим файл класса.
Сообщаемые основные цифры:
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
(Источник: Википедия)
Чтобы устранить реальную проблему, вы должны попытаться либо запустить код Java с более новой версией Java JRE, либо указать целевой параметр для компилятора Java, чтобы дать указание компилятору создавать код, совместимый с более ранними версиями Java.
Например, чтобы создать файлы классов, совместимые с Java 1.4, используйте следующую командную строку:
javac -target 1.4 HelloWorld.java
В новых версиях компилятора Java вы, вероятно, получите предупреждение о том, что путь к классу начальной загрузки не задан. Больше информации об этой ошибке доступно в блоге. Новое предупреждение javac для установки более старого источника без bootclasspath.
java.lang.UnsupportedClassVersionError
происходит из-за более высокого JDK во время компиляции и более низкого JDK во время выполнения.
В Eclipse я просто зашел в команду меню Window -> Preferences -> Java -> Compiler и затем установил "Уровень соответствия Compiler" на 1.6.
Не волнуйся, я понял это.
Это на самом деле просто - вам нужно установить ОБА JRE / JDK с той же версией.
JRE 6 -> JDK 6
JRE 7 -> JDK 7
И так далее.
Эта ошибка означает, что вы пытаетесь загрузить файл "класса" Java, который был скомпилирован с более новой версией Java, чем вы установили.
Например, ваш .class
файл мог быть скомпилирован для JDK 7, и вы пытаетесь запустить его с JDK 6.
Таким образом, решение заключается в том, чтобы:
- Обновите среду выполнения Java или
Перекомпилируйте класс, если у вас есть источник, используя ваш локальный компилятор Java (если он у вас есть).
javac FileName.java
Для разработчиков это может произойти, если другой разработчик зарегистрирует файл.class, и у него будет более новая версия Java, чем у вас!
Вы пытаетесь запустить свою программу с версией Java, которая не поддерживает версию, в которой был скомпилирован код. Таким образом, в основном вы должны скомпилировать свой код с более высокой версией и попытаться запустить его с более низкой версией.
Как вы получаете
Unsupported major.minor version 51.0
и версия 51.0 соответствует J2SE 7, вы, скорее всего, скомпилировали свой код в Java 7 и пытаетесь запустить его, используя более низкую версию. Проверь что java -version
дисплеи. Это должна быть версия Java 7. Если нет, внесите соответствующие изменения в PATH/JAVA_HOME. Или вы можете скомпилировать с той же версией, которую пытаетесь запустить код. Если конфигурации сбивают с толку, вы всегда можете указать абсолютный путь /home/user/jdk1.7.0_11/bin/javac
а также /home/user/jdk1.7.0_11/bin/java
,
У меня была похожая ситуация на Mac, и у меня работал следующий процесс:
В терминале введите
vi ~/.profile
Затем добавьте эту строку в файл и сохраните
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
где версия на вашем компьютере, например, 1.7.0_25
,
Выйдите из редактора, затем введите следующую команду, чтобы он вступил в силу
source ~/.profile
Затем введите java -version, чтобы проверить результат
java -version
Что такое .profile
файл?
Файл.profile - это скрытый файл. Это необязательный файл, который сообщает системе, какие команды запускать, когда пользователь, чей файл профиля входит в систему. Например, если мое имя пользователя - bruno и в /Users/bruno/ есть файл.profile, то все его содержимое будет выполнен во время процедуры входа в систему.
В меню Eclipse Window -> Preferences -> Java -> Compiler отметьте также "Настройка параметров проекта".
Если у вас все еще есть ошибка с той же версией Java: попробуйте удалить папку сборки вашего проекта вручную. Затем перезапустите Eclipse.
Вы можете иметь некоторую библиотеку JAR, скомпилированную в Java 7, и у вас есть только Java 6 в качестве Java Runtime. Это может произойти с некоторыми новыми библиотеками.
Наиболее распространенная проблема - неправильная настройка вашего JAVA_HOME
переменная, которая должна указывать на правильную библиотеку Java Development Kit, если у вас установлено несколько файлов.
Чтобы узнать, где находится папка Java SDK, выполните следующие команды:
jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'
Debian / Ubuntu
Чтобы проверить, какой java (openjdk) вы установили, проверьте через:
dpkg -l "openjdk*" | grep ^i
или же:
update-java-alternatives -l
Чтобы изменить это, используйте:
update-alternatives --config java
Префикс с sudo
если необходимо.
выбрать альтернативную версию Java.
Или проверьте, какие доступны для установки:
apt-cache search ^openjdk
Префикс с sudo
если необходимо.
Затем вы можете установить, например:
apt-get install openjdk-7-jre
Префикс с sudo
если необходимо.
Fedora, Oracle Linux, Red Hat
Установите / обновите соответствующий пакет через:
yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
java-1.7.0-openjdk
Пакет содержит только среду выполнения Java. Если вы хотите разрабатывать программы на Java, установитеjava-1.7.0-openjdk-devel
пакет.
BSD
В коллекции портов FreeBSD есть пакет OpenJDK 7, называемый openjdk7, который, вероятно, необходимо перенастроить.
Смотрите: OpenJDK вики-страница.
Windows
Просто установите соответствующую библиотеку Java SE Development Kit с сайта Oracle или установите
Дженкинс
Если у вас возникла эта проблема с Дженкинсом, смотрите:
Однако выбор правильной версии Java (новее) с update-alternatives
должно сработать.
Я получил ту же проблему с проектом, написанным в 1.7, и попытался выполнить в 1.6.
Мое решение в Eclipse:
Щелкните правой кнопкой мыши на свойства вашего проекта -> Путь сборки Java -> Библиотеки
Выберите системную библиотеку JRE, нажмите " Правка" справа и выберите целевой JRE.
Теперь перейдите к компилятору Java слева и измените уровень соответствия компилятора на свою цель.
Это сработало для меня.
Я столкнулся с той же проблемой, когда работал над сценарием Ant для создания своего приложения.
Я использую Eclipse для разработки приложений и изменил версию компилятора в свойствах сборки проекта. Но это не сработало для меня. Затем я узнал, что могу предоставить версию компилятора в скрипте Ant.
Я изменил скрипт Ant в разделе, где он компилирует файлы Java.
<target name="build-java" depends="prepare-build">
<echo message="Compiling java files"/>
<javac ....
target="1.5"...
</javac>
</target>
Это сработало для меня, чтобы решить неподдерживаемую главную незначительную проблему.
Как ответили в другом месте несколько человек, программа Java работает на более старой версии Java, чем та, для которой она была скомпилирована. Это должно быть "кросс-компилировано" для обратной совместимости. Другими словами, существует несоответствие между исходной и целевой версиями Java.
Изменение параметров в меню Eclipse не отвечает первоначальному постеру, который сказал, что не использует Eclipse. В OpenJDK javac версии 1.7 вы можете кросс-компилировать для 1.6, если вы используете параметры -source
а также -target
, плюс укажите файл rt.jar целевой версии (то есть более старой) во время компиляции. Если вы действительно устанавливаете 1.6 JRE, вы можете указать на его установку (например, /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar в Ubuntu, /usr/jdk/jdk1.6.0_60/jre/lib/rt.jar в SunOS, по-видимому. Извините, я не знаю, где это находится в системе Windows). Вот так:
javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java
Похоже, вы можете просто скачать rt.jar из Интернета и указать на него. Это не слишком элегантно, хотя:
javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java
Основываясь на этом...
J2SE 8 = 52
J2SE 7 = 51
J2SE 6.0 = 50
J2SE 5.0 = 49
JDK 1.4 = 48
JDK 1.3 = 47
JDK 1.2 = 46
JDK 1.1 = 45
В Eclipse щелкните правой кнопкой мыши проект в проводнике пакетов:
Путь сборки -> Настройка пути сборки
Под:
Путь сборки Java -> Библиотеки -> Добавить библиотеку -> Системная библиотека JRE -> Установленные JRE -> Поиск.
Добавьте требуемую JRE, выбрав библиотеку в списке доступных после завершения поиска.
Если вы столкнулись с этой проблемой при использовании Maven, вы можете выполнить кросс-компиляцию своего кода, используя подключаемый модуль Maven Compiler.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
.....
ОБНОВЛЕНИЕ: установить source
а также target
в 1.8
, если вы используете JDK 8.
Если вы используете Maven, установите уровень компиляции Java. Откройте командную строку и напишите
java -version
для вашего уровня компиляции:Если вы используете IntelliJ IDEA, выберите проект → Файл → Настройки → Развертывание выполнения сборки → Компилятор → Компилятор Java. Затем измените байт-код на 1.7, как показано ниже:
Вы использовали более высокую версию JDK для компиляции и пытались запустить ее из более низкой версии JDK / JRE.
Чтобы проверить это, посмотрите информацию о версии:
javac -version
java -version
Они будут отличаться, и у javac будет более высокий номер версии.
Чтобы обойти это, запустите с использованием Java из версии JDK или, если у вас есть более новая версия JRE/JDK, которая также будет работать.
which javac
скажу вам местоположение, например, /usr/bin/javac
, Просто бегите напрямую, используя /usr/bin/java <program>
,
ИЛИ вы можете установить переменную среды как постоянное решение.
У меня было то же сообщение об ошибке при запуске Ant из Eclipse, но другие решения, упомянутые здесь, не решили мою проблему. Самое смешное, что запуск Ant из командной строки Windows работал нормально, поэтому это должно было быть проблемой конфигурации в Eclipse.
Оказалось, что в Eclipse вы можете указать среду, в которой должен работать Ant, и это было установлено как JRE вместо JDK.
- Перейдите: Выполнить -> Внешние инструменты -> Конфигурации внешних инструментов...
- Выберите Ant build.xml для вашего проекта (если у вас есть несколько проектов)
- Активировать вкладку "JRE"
- Здесь был выбран "Отдельный JRE: JRE6". Когда я изменил это на JDK из серии 1.6 или 1.7, ошибка исчезла.
Как мне это исправить?
Эта ошибка означает, что JRE, которая используется для выполнения кода вашего класса, не распознает используемую версию Java. Обычно потому, что версия Java, сгенерировавшая ваш файл класса (то есть скомпилированная), новее.
Чтобы исправить это, вы можете
a) Скомпилируйте исходные коды Java с той же или более старой версией компилятора Java, который будет использоваться для его запуска. т.е. установить соответствующий JDK.
б) Скомпилируйте исходные коды Java с более новой версией компилятора Java, но в режиме совместимости. т.е. использовать -target
параметр.
c) Запустите скомпилированные классы в JRE той же или более новой версии, что и JDK, использованный для компиляции классов.
Вы можете проверить версии, которые вы используете в настоящее время сjavac -version
для компилятора и java -version
за время выполнения.
Должен ли я установить JDK и настроить переменную PATH для JDK вместо JRE?
Конечно, для компиляции установите и настройте конкретный JDK, который вы хотите.
Для времени выполнения вы можете использовать тот, который поставляется с JDK или автономным JRE, но, тем не менее, убедитесь, что вы установили правильные версии и настроили свой PATH так, чтобы не было никаких неожиданностей.
В чем разница между переменной PATH в JRE или JDK?
Переменная среды PATH сообщает командной оболочке, где искать введенную вами команду. Когда вы печатаете java
интерпретатор командной оболочки просматривает все местоположения, указанные в PATH
переменная, слева направо, чтобы найти подходящий java
исполняемый файл для запуска. Если у вас установлено несколько версий Java - т.е. java
исполняемый в нескольких местах, указанных в переменной PATH, тогда первым будет выполнено перемещение при переходе слева направо.
Команда компилятора javac
и поставляется только с JDK. Команда времени выполнения java
и идет с JDK и находится в JRE.
Вероятно, у вас есть одна версия (51.0 = Java 7) javac
установлен, и у вас также есть та же версия java
установлен, но это еще одна предыдущая версия java
появляется ранее в PATH и поэтому вызывается вместо того, который вы ожидаете.
Возникла эта проблема, когда я вернулся к Java 6 и попытался запустить классы, ранее скомпилированные с Java 7. Что мне сработало, так это Preferences > java > compiler -> установите уровень соответствия 1.6 и решительно "настройте параметры проекта".
Я решил это. Я побежал:
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
Ошибка вводит в заблуждение, Unsupported major.minor version 51.0
, Это создает впечатление, что версия 51 (Java 7) не поддерживается. И мы должны использовать Java 6.
Ошибка должна была быть:
Текущая версия Java, 50, не поддерживается. Вместо этого используйте версию 7 Java (51:0 и выше).
Ваш Java-файл скомпилирован с другой версией (более высокая версия компилятора), чем версия (более низкая версия времени выполнения), с которой вы пытаетесь его запустить.
Понятно, что классы, скомпилированные с более низкими версиями, должны запускаться в более поздних версиях. Но обратное (скомпилированное с более высокой версией компилятора и пытающееся запустить его с более низкой версией времени исполнения) иногда совершенно невозможно.
Следовательно, вы видите эту ошибку при попытке выполнить вашу программу. Неподдерживаемая версия major.minor xx
В: Я создал приложение в Java 7, но когда мои пользователи пытаются запустить его, они получают ошибку Unsupported major.minor version 51.0. Что это значит и что я могу с этим сделать?
A: Если вы компилируете приложение, используя javac в Java 7, результирующие файлы классов будут иметь номер версии 51.0. Версии Java до 7 не распознают этот номер, поэтому вашим пользователям придется выполнить обновление до Java 7 до запуска вашего приложения. Если вы не используете API-интерфейсы Java 7, вы можете попытаться скомпилировать ваше приложение, используя javac -target 1.6 для создания 1.6-совместимого файла классов. Если ваше приложение развернуто с помощью веб-запуска, вы можете указать минимальную требуемую версию. Для получения дополнительной информации см. Документацию по Java Web Start и JNLP здесь. Эта проблема исчезнет, как только мы запустим автообновление в Java 7 для конечных пользователей, которые в настоящее время имеют Java 6 на своих рабочих столах. Сроки для этого еще не определены, мы хотим дать разработчикам время для решения любых проблем между их кодом и JDK 7 в первую очередь.
(Источник: oracle.com.)
Сегодня это сообщение об ошибке появилось в нашем Tomcat 7 на Ubuntu 12.04.2 LTS (Precise Pangolin):
/var/log/tomcat7/localhost.2014-04-08.log:
8 апреля 2014 г. 9:00:55 org.apache.catalina.core.StandardContext filterStart
SEVERE: Исключительные пусковые фильтрующие стойки2
java.lang.UnsupportedClassVersionError: controller / ReqAccept: Неподдерживаемая версия major.minor 51.0 (невозможно загрузить контроллер класса.ReqAccept)
Приложение Struts скомпилировано с Java 7.
Оказалось, кто-то использует "службу tomcat [stop/start]" для перезапуска Tomcat 7,
$ ps -ef | гре ява
tomcat7 31783 1 32 20:13? 00:00:03 / usr / lib / jvm / default-java / bin / java...
$ / usr / lib / jvm / default-java / bin / java -version
Java-версия "1.6.0_27"
Что приводит к ошибке "Неподдерживаемая major.minor версия 51.0".
Когда мы использовали "/etc/init.d/tomcat7 [stop/start]" для перезапуска Tomcat 7, проблема была решена.
$ ps -ef | гре ява
tomcat7 31886 1 80 20:24? 00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
Java-версия "1.7.0_15"
О, Mac OS X I смогла решить эту проблему, установив переменную JAVA_HOME:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
В моем случае проблема была в конфигурации сервера:
Проверьте, является ли JRE нужной вам версией:
Проект был в версии 1.7, а сервер JRE был установлен как 1.6, после перехода на правильную версию java он запустился нормально.
Сначала давайте разберемся с основами...
JRE - это компонент в NetBeans/ Eclipse/ standalone, который предоставит вам библиотеки, JVM, плагины Java и веб-запуск Java. Обратите внимание, что он не предоставляет компиляторы или отладчики.
JDK - это расширенный набор JRE вместе с компиляторами и отладчиками.
Поэтому, когда у вас есть библиотека по умолчанию в виде JRE вместо JDK, вам будет приятно импортировать материал, но он не будет компилироваться.
Вместо этого установите ваш путь к JDK (я использую NetBeans, и я устанавливаю их, используя netbeans.conf в netbeans/etc/netbeans.conf и меняю путь).
У меня была проблема, из-за которой мне приходилось запускать компиляцию Maven для моего проекта из командной строки, чтобы запускать мои модульные тесты; если я внес изменение в тестовый класс и позволил Eclipse автоматически его перекомпилировать, то я получил ошибку "Unsupported major.minor version 51.0".
У меня установлены и JDK6, и JDK7, но все мои настройки JRE были на уровне 1.6, как в pom, так и на странице свойств проекта в Eclipse. Никакое количество Maven Update Project и / или обновлений не решило эту проблему.
Наконец я попытался закрыть проект и снова открыть его, и это, казалось, исправило это! НТН
Вы скомпилировали свой класс Java с JDK 7 и пытаетесь запустить тот же класс на JDK 6 .
- Установите JDK 7.0.55 и установите Java для Eclipse для JDK 7.0.55.
- Создайте проект с помощью JDK 7.0.55, настроив путь сборки JDK 7.0.55.
- Установите компилятор в Eclipse для JDK 7.0.55 через меню Windows -> Настройки -> Java -> Компилятор - выберите 1.7.