java - idea - unsupported major.minor version 51.0 maven




Как исправить java.lang.UnsupportedClassVersionError: Неподдерживаемая версия major.minor (20)

Я пытаюсь использовать 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 могут быть старыми или слишком новыми.

  1. Как это исправить?
  2. Должен ли я установить JDK и настроить свою переменную пути в JDK вместо JRE?
  3. В чем разница между переменной PATH в JRE или JDK?

Как это исправить?

Эта ошибка означает, что JRE, который используется для выполнения вашего кода класса, не распознает используемую версию Java. Обычно потому, что версия Java, которая сгенерировала ваш файл класса (т.е. скомпилировала его), является более новой.

Чтобы исправить это, вы можете

a) Скомпилируйте свои источники Java с той же самой или более старой версией компилятора Java, которая будет использоваться для ее запуска. т.е. установить соответствующий JDK.

b) Скомпилируйте ваши источники 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 runtime для запуска. Если у вас несколько версий Java, то есть у вас есть исполняемый файл java в нескольких местах, указанных в переменной PATH, то первый, который встречается при движении слева направо, будет выполняться.

Команда компилятора javac и поставляется только с JDK. Команда runtime является java и поставляется с JDK и находится в JRE.

Вероятно, у вас установлена ​​одна версия (51.0 = Java 7) javac , и у вас также установлена ​​одна и та же версия java , но другая предыдущая версия java появляется ранее в PATH и поэтому вызывается вместо один, которого вы ожидаете.


В Eclipse я просто перешел в команду меню Window -> Preferences -> Java -> Compiler, а затем установил «Уровень соответствия компилятора» на 1.6.


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

Проверьте JRE - это необходимая версия:

Проект был в версии 1.7, а сервер JRE был установлен как 1.6, после того, как он перешел к правильной версии java, которую он запустил.


Ваш файл Java скомпилирован с другой версией (более поздняя версия компилятора), чем версия (более низкая версия исполнения), с которой вы пытаетесь ее запустить.

Понятно, что классы, скомпилированные с более низкими версиями, как ожидается, будут работать в более поздних версиях. Но противоположное (скомпилированное с более высокой версией компилятора и пытающееся запустить его с более низкой версией исполнения), иногда невозможно.

Следовательно, при попытке выполнить вашу программу вы увидите эту ошибку. Неподдерживаемая версия major.minor xx

В: Я создал приложение в Java 7, но когда мои пользователи пытаются его запустить, они получают ошибку Unsupported major.minor версии 51.0. Что это значит и что я могу с этим поделать?

A: Если вы скомпилируете приложение с помощью javac в Java 7, то в результате файлы классов будут иметь номер версии версии 51.0. Версии Java до 7 не распознают этот номер, поэтому вашим пользователям придется перейти на Java 7 до запуска вашего приложения. Если вы не используете Java 7 API, вы можете попытаться скомпилировать ваше приложение с помощью javac -target 1.6, чтобы создать 1.6-совместимый файл класса. Если ваше приложение развернуто с помощью webstart, вы можете указать минимальную требуемую версию. Для получения дополнительной информации см. Документы в Java Web Start и JNLP. Эта проблема исчезнет, ​​как только мы запустим autoupdate для Java 7 для конечных пользователей, в настоящее время имеющих Java 6 на своих рабочих столах. Сроки для этого еще не определены, мы хотим дать разработчикам время для разработки любых проблем между их кодом и JDK 7.

(Источник: oracle.com .)


Вы использовали более высокую версию JDK для компиляции и попыток запуска из более низкой версии JDK / JRE .

Чтобы проверить это, см. Информацию о версии:

javac -version

java -version

Они будут разными, а javac будет иметь более высокий номер версии.

Чтобы обойти это, используйте java из версии JDK или если у вас есть более новая JRE / JDK, которая также будет работать.

which javac скажет вам местоположение, например, /usr/bin/javac . Просто запустите прямо с помощью /usr/bin/java <program> .

ИЛИ вы можете установить переменную окружения в качестве постоянного решения.


Вы пытаетесь запустить свою программу с версией 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/javac и /home/user/jdk1.7.0_11/bin/java .


Если вы столкнулись с этой проблемой при использовании 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>
       .....

UPDATE: установите source и target 1.8 , если вы используете JDK 8.


Как было сказано в другом месте несколькими людьми, 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

Наиболее распространенной проблемой является неправильная конфигурация вашей переменной JAVA_HOME которая должна указывать на нужную библиотеку Java Development Kit, если у вас несколько установленных.

Чтобы найти папку SDK Java, выполните следующие команды:

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 Runtime Environment. Если вы хотите разработать Java-программы, тогда установите пакет java-1.7.0-openjdk-devel .

BSD

Существует пакет OpenJDK 7 в коллекции портов FreeBSD, называемый openjdk7 который, вероятно, необходимо переконфигурировать.

См. Страницу Wiki в OpenJDK .

Windows

Просто установите соответствующую библиотеку Java SE Development Kit с сайта Oracle или установите

Дженкинс

Если вы столкнулись с этой проблемой с Дженкинсом, см .:

Однако следует выбрать правильную версию Java (новее) с update-alternatives версиями update-alternatives .


Не волнуйся, я решил.

Это на самом деле просто - вам нужно установить BOTH JRE / JDK с той же версией.

JRE 6 -> JDK 6

JRE 7 -> JDK 7

И так далее.


Основываясь на этом...

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, выбрав библиотеку в списке, доступном после завершения поиска.


Показанный номер версии описывает версию 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

(Источник: Wikipedia )

Чтобы исправить настоящую проблему, попробуйте либо запустить Java-код с более новой версией Java JRE, либо указать целевой параметр компилятору Java, чтобы дать команду компилятору создать код, совместимый с более ранними версиями Java.

Например, чтобы генерировать файлы классов, совместимые с Java 1.4, используйте следующую командную строку:

javac -target 1.4 HelloWorld.java

С более новыми версиями компилятора Java вы, скорее всего, получите предупреждение о том, что путь класса bootstrap не задан. Дополнительная информация об этой ошибке доступна в сообщении в блоге. Новое предупреждение javac для установки более старого источника без bootclasspath .


Сначала давайте немного подходим к основам ...

JRE является компонентом в NetBeans / Eclipse / standalone, который предоставит вам библиотеки, JVM, плагины Java и веб-начало Java. Обратите внимание, что он не предоставляет компиляторов или отладчиков.

JDK - это надмножество JRE наряду с уступчиками и отладчиками.

Поэтому, когда у вас есть библиотека по умолчанию как JRE вместо JDK, у вас будет приятное время для импорта, но она не будет компилироваться.

Вместо этого укажите свой путь к JDK (я использую NetBeans, и я установил их с помощью netbeans.conf в netbeans / etc / netbeans.conf и изменил путь).


У вас может быть библиотека JAR, скомпилированная в Java 7, и у вас есть только Java 6 как Java Runtime. Это может случиться с некоторыми новыми библиотеками.


У меня было такое же сообщение об ошибке при запуске Ant из Eclipse, но другие решения, упомянутые здесь, не помогли решить мою проблему. Самое смешное было то, что запуск Ant из командной строки Windows работал нормально, поэтому в Eclipse это была проблема конфигурации.

Оказалось, что в Eclipse вы можете указать среду, с которой должен работать Ant, и это было установлено как JRE вместо JDK.

  • Перейдите к: Запуск -> Внешние инструменты -> Настройки внешних инструментов ...
  • Выберите Ant build.xml для вашего проекта (если у вас несколько проектов)
  • Активируйте вкладку «JRE»
  • Здесь была выбрана «Отдельная JRE: jre6». Когда я изменил это на JDK из серии 1.6 или 1.7, ошибка исчезла.

У меня возникла проблема, из-за которой мне приходилось запускать компиляцию Maven в моем проекте из командной строки для запуска моих модульных тестов; если я внес изменения в тестовый класс и пусть Eclipse автоматически перекомпилирует его, то я получил ошибку «Неподдерживаемый major.minor version 51.0».

У меня есть как JDK6, так и JDK7, но все мои настройки JRE указывали на 1.6, как на pom, так и на странице свойств проекта в Eclipse. Никакое количество обновлений Maven Project и / или обновление не разрешило это.

Наконец, я попытался закрыть проект и снова открыть его, и это, похоже, исправить! НТН


Я получил ту же проблему с проектом, написанным в 1.7, и попытался выполнить в 1.6.

Мое решение в Eclipse:

  • Щелкните правой кнопкой мыши по вашим свойствам проекта -> путь сборки Java -> библиотеки

  • Выберите свою Системную библиотеку JRE и нажмите « Изменить» справа и выберите целевую JRE.

  • Теперь перейдите в Java Compiler слева и измените уровень соответствия компилятора вашей цели.

Это сработало для меня.


Я решил это. Я побежал:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

Ошибка вводит в заблуждение, Unsupported major.minor version 51.0 . Это создает впечатление, что версия 51 (Java 7) не поддерживается. И мы должны использовать Java 6.

Ошибка должна была быть:

Текущая версия Java, 50, не поддерживается. Вместо этого используйте Java версии 7 (51: 0 и выше). `


java.lang.UnsupportedClassVersionError происходит из-за более высокого JDK во время компиляции и более низкого JDK во время выполнения.


  • Установите 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.




unsupported-class-version