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

Тому я мушу зробити висновок про щось інше, внутрішнє для самого класу, кидаючи виняток ?? Це навіть можливо?


2
чи є у вас складена версія бібліотеки десь в іншому місці, яка може бути першою на вашому класі
Джефф Сторі

Гарна ідея, але ні. Я зробив перевірку, використовуючи 'find. -імен '* .jar' | xargs знайдіть 'з папки lib разом із JAR. Крім того, я не думав, що Eclipse використовує CLASSPATH? Будь-які інші хороші пропозиції?
grmn.bob

як використовувати цю команду find -name '* .jar' на cmd, коли я хочу знову відновити код jre src ... і для цього мені потрібно запустити цей cmd ..... javalobby.org/java/forums /t103334.html.....my jdk знаходиться на C: \ Program Files \ Java \ jdk1.6.0_31
Learner

Відповіді:


185

Я дізнався, що подібні повідомлення про помилки зазвичай є правильними. Коли це не могло МОЖЛИВО (на вашу думку) бути таким, про що повідомляється про помилку, ви вирушаєте на пошуки проблеми в іншій області ... лише щоб дізнатися години пізніше, що оригінальне повідомлення про помилку справді було правильним.

Оскільки ви користуєтеся Eclipse, я думаю, що в Thilo це правильно. Найімовірнішою причиною отримання цього повідомлення є те, що один із ваших проектів складає 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 в моє затемнення і використав компілятор 1.6. Потім все почало нормально працювати.
Ванчинатан Чандрасекараран

1
Я хочу підтвердити це вдруге, тому що це вже другий раз, коли у мене виникло питання, я шукав, знайшов цю відповідь, і це було правильно. > _ <
AlbeyAmakiir

9

Ви намагалися виконати повне "чисте", а потім відновити в Eclipse (Project-> Clean ...)?

Чи можете ви компілювати та працювати з "javac" та "java" прямо з командного рядка? Це працює правильно?

Якщо ви клацніть правою кнопкою миші на своєму проекті, перейдіть до "Властивості" та перейдіть до "Шлях збірки Java", чи є підозрілі записи на будь-якій з вкладок? Це по суті ваш КЛАССПАТ.

У налаштуваннях Eclipse ви також можете двічі перевірити розділ «Встановлені JRE» у розділі «Java» та переконатися, що він відповідає тому, що ви вважаєте за належне.

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


так (повністю чисто); не пробували цього (проект із cmd рядка); можливо / ні (я видалив записи з Eclipse "Java Build Path"); зробив це (JRE - саме там я отримав версію #).
grmn.bob

5

Ви компілювали з Eclipse? Він використовує інший компілятор (не javac). Це не повинно призвести до цієї помилки (якщо все налаштовано належним чином), але ви можете спробувати компілювати її замість javac.

Якщо це вирішило проблему, спробуйте перевірити, чи є у Eclipse якісь неправильні налаштування компілятора. Зокрема, націліть її на Java 5.


Це я навчаюсь. Я збираюся спробувати побудувати ці дві частини однаково (cmd лінія та / або затемнення).
grmn.bob

1
Дякую Thilo, сьогодні я багато чого дізнався про версії Eclipse, Java та класи. І трохи про мураш теж.
grmn.bob

2

Я також отримав таку ж помилку. Причиною тому я складав проект за допомогою Maven. У мене JAVA_HOME вказував на JDK7, отже, для компіляції використовувався java 1.7, і при запуску проекту я використовував JDK1.5. Зміна нижченаведеного запису у файлі .classpath або зміна затемнення, як на скріншоті, вирішили проблему.

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

або зміни в ході конфігурацій затемнення як введіть тут опис зображення


1

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

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">

0

Інший сценарій, коли це могло статися, - це коли ви запускаєте екземпляр затемнення (для налагодження тощо) від затемнення хоста - в цьому випадку зміна рівня проекту або бібліотеки JRE лише на класному шляху проекту не допомагає. Важливо, що JRE використовується для запуску цільового середовища затемнення.


0

Завжди перевіряйте на очевидне теж. Я отримав цю помилку одного разу, коли випадково схопив невірний ресурс для дії додавання та видалення сервера. Це можна легко не помітити.


0

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


0

зміна проекту на використання java 1.7. Для цього виконайте ці кроки:

  • Змініть рівень відповідності компілятора
  • Змініть свої проекти JRE / JDK на щось аналогічне (1,7 в моєму випадку)
  • Зробіть однакові зміни у всіх проектах, на які посилається ваш проект
  • Змініть конфігурацію запуску / налагодження, щоб використовувати JRE / JDK (або того ж рівня)

Не працює?

  • видалити каталог проекторів
  • Чисто
  • reBuild

Все ще не працює?

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

Щасти!


0

Я вирішив цю проблему, змінивши jre, необхідний для сервера (у моєму випадку - tomcat). На вкладці Сервер у затемненні двічі клацніть на сервері (для того, щоб відкрити сторінку для конфігурації сервера), натисніть на середовище виконання, а потім змініть необхідну JRE

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.