java.lang.UnsupportedClassVersionError: неверный номер версии в файле .class?

140

Я получаю эту ошибку, когда включаю библиотеку с открытым исходным кодом, которую мне пришлось скомпилировать из исходного кода. Теперь все предложения в Интернете указывают на то, что код был скомпилирован в одной версии и выполнен в другой версии (от новой к старой). Однако в моей системе установлена ​​только одна версия JRE. Если я запустил команды:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

и проверьте в Eclipse свойства библиотеки java, я получаю 1.5.0_18

Следовательно, я должен заключить, что что-то еще, внутреннее по отношению к самому классу, вызывает исключение ?? Это вообще возможно?

grmn.bob
источник
2
у вас есть скомпилированная версия библиотеки где-то еще, которая может быть первой в вашем пути к классам?
Джефф Стори
Хорошая идея, но нет. Я проверил с помощью find. -name '* .jar' | xargs locate 'из папки lib с файлами JAR. Кроме того, я не думал, что Eclipse использует CLASSPATH? Есть другие хорошие предложения?
grmn.bob
как использовать эту команду find -name '* .jar' в cmd, поскольку я хочу снова перестроить код jre src ... и для этого мне нужно запустить этот cmd ..... javalobby.org/java/forums /t103334.html ..... мой jdk находится в C: \ Program Files \ Java \ jdk1.6.0_31
Learner

Ответы:

185

Я узнал, что подобные сообщения об ошибках обычно верны. Когда это ВОЗМОЖНО (в вашем уме) не может быть тем, о чем говорится в сообщении об ошибке, вы отправляетесь на поиски проблемы в другой области ... только для того, чтобы через несколько часов узнать, что исходное сообщение об ошибке действительно было правильным.

Поскольку вы используете Eclipse, я думаю, что Тило прав. Наиболее вероятная причина, по которой вы получаете это сообщение, заключается в том, что один из ваших проектов компилирует классы 1.6. Не имеет значения, есть ли у вас в системе только 1.5 JRE, потому что Eclipse имеет свой собственный компилятор (не javac), и для компиляции классов 1.6 требуется только 1.5 JRE. Это может быть странно, и для этого нужно снять флажок, но мне удалось это сделать.

Для рассматриваемого проекта проверьте свойства проекта (обычно Alt + Enter), раздел Java Compiler. Вот изображение проекта, настроенного для компиляции 1.6, но только с 1.5 JRE.

введите описание изображения здесь

Джошуа Маккиннон
источник
Полностью согласен ... поэтому в своем комментарии я задал вопрос о способах точного определения. Я не знал о внутренних классах Eclipse. Библиотека была скомпилирована в командной строке с помощью javac и интегрирована в мой проект Eclipse. Я попробую скомпилировать свой проект из командной строки. Вы явно уже решали эту проблему в прошлом, и ваши предложения просто фантастические.
grmn.bob
3
Если у вас есть JDK (у которого есть исходники), вы сможете добавить несколько точек останова в Eclipse и, надеюсь, увидеть, какой класс он пытается загрузить. Самый простой способ - это, вероятно, точка останова в конструкторе для UnsupportedClassVersionError (или точка останова Eclipse Exception, значок «J!»), После чего вы можете проверить, как она туда попала.
Джошуа Маккиннон
ОК. Я нашел эксперта в здании, и он смог указать Eclipse на ту же среду JRE, что и моя командная строка. Затем я пересобирал 1.6 и запускал 1.6, и все работает. Очевидно, я ошибался, не имея ничего, кроме 1.5. Он показал мне, где искать. Спасибо за помощь - теперь я перехожу к следующей проблеме! :)
grmn.bob
2
Я была такая же проблема. Моя ошибка заключалась в том, что я использовал компиляторы 1.5 JRE и 1.6. Что не решило ошибку неподдерживаемой версии класса. Поэтому я установил 1.6 JRE в свой eclipse и использовал компилятор 1.6. Потом все заработало нормально.
Ванчинатан Чандрасекаран
1
Я хочу проголосовать за это второй раз, потому что это второй раз, когда у меня была проблема, я искал, нашел этот ответ, и это было правильно. > _ <
AlbeyAmakiir 09
9

Вы пробовали выполнить полную «очистку», а затем перестроить в Eclipse (Project-> Clean ...)?

Можете ли вы скомпилировать и запустить с javac и java прямо из командной строки? Это правильно работает?

Если вы щелкните свой проект правой кнопкой мыши, перейдите в «Свойства», а затем в «Путь сборки Java», есть ли какие-либо подозрительные записи на любой из вкладок? По сути, это ваш КЛАСС.

В настройках Eclipse вы также можете дважды проверить раздел «Установленные JRE» в разделе «Java» и убедиться, что он соответствует тому, что, по вашему мнению, должно быть.

У вас определенно есть либо устаревший файл .class, либо вы получаете несоответствие времени компиляции / времени выполнения в версиях Java, которые вы используете.

Брент пишет код
источник
да (полная чистка); не пробовал (проект из строки cmd); возможно / нет (я удалил записи из Eclipse «Путь сборки Java»); сделал это (JREs - вот где я получил версию #).
grmn.bob
5

Вы компилировали с Eclipse? Он использует другой компилятор (не javac). Это не должно приводить к этой ошибке (если все настроено правильно), но вместо этого вы можете попробовать скомпилировать ее с помощью javac.

Если это устранило проблему, попробуйте проверить, есть ли в Eclipse неправильные настройки компилятора. В частности, он нацелен на Java 5.

Тило
источник
Вот чему я учусь. Я собираюсь попробовать построить две части таким же образом (строка cmd и / или eclipse).
grmn.bob
1
Спасибо, Тило, сегодня я много узнал о Eclipse, Java и версиях классов. И немного о муравье .
grmn.bob
2

У меня тоже такая же ошибка. Причина в том, что я компилировал проект с помощью Maven. У меня был JAVA_HOME, указывающий на JDK7, и поэтому для компиляции использовалась java 1.7, а при запуске проекта я использовал JDK1.5. Изменение указанной ниже записи в файле .classpath или изменение в eclipse, как показано на скриншоте, решило проблему.

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

или измените конфигурацию запуска eclipse как введите описание изображения здесь

Викки
источник
1

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

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">
Jeshurun
источник
0

Другой сценарий, в котором это может произойти, - это когда вы запускаете экземпляр eclipse (для отладки и т. Д.) Из хоста eclipse - в этом случае изменение уровня проекта или библиотеки JRE в пути к классам проекта само по себе не помогает. Важно то, что JRE используется для запуска целевой среды eclipse.

Джей
источник
0

Всегда проверяйте и очевидное. Я получил эту ошибку один раз, когда случайно взял не тот ресурс для действия добавления и удаления сервера. Это легко не заметить.

Джеймс Дринкард
источник
0

Также подойдет удаление файлов настроек конкретного проекта (рабочая область Eclipse / папка проекта / .settings /) из папки проекта. Очевидно, нам нужно очистить проект и построить его после удаления.

пользователь3471219
источник
0

изменение проекта на использование java 1.7: Чтобы это работало, выполните следующие действия:

  • Изменить уровень соответствия компилятора
  • Измените свои проекты JRE / JDK на тот же уровень (1,7 в моем случае)
  • Сделайте то же изменение во всех проектах, на которые ссылается ваш проект.
  • Измените конфигурацию запуска / отладки, чтобы использовать JRE / JDK (или того же уровня)

Не работает?

  • удалить проекты Bin каталог
  • Чистый
  • перестроить

Все еще не работает?

в каталоге вашего проекта: отредактируйте .settings / org.eclipse.jdt.core.prefs> убедитесь, что ваш целевой уровень применен

Удачи!

Li3ro
источник
0

Я решил эту проблему, изменив jre, необходимый для сервера (в моем случае это tomcat). На вкладке «Сервер» в eclipse дважды щелкните сервер (чтобы открыть страницу конфигурации сервера), щелкните «Среда выполнения», затем измените требуемую JRE.

окрампико
источник