Java 1.8 ASM ClassReader не змогла проаналізувати файл класу - можливо, через нову версію файлу класу Java, яка ще не підтримується


87

Моя веб-програма працює нормально на JDK 1.7, але аварійно завершує роботу 1.8 за наступним винятком (під час запуску сервера додатків з Jetty 8). Я використовую Spring версію: 3.2.5.ВИПУСК.

Виняток:

org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet

Я припускаю, що проблема виникає через весну та бібліотеку "asm.jar", від яких вона залежить.

Як я можу це вирішити?


Ви збираєте свій веб-додаток як Java 8 або Java 7? Якщо 8, це має бути можливість компілювати ваші класи, націлені на Java 7, але все одно запускати його під Java 8.
обрізати

3
Якщо ви хочете націлитись на Java8, вам знадобиться Spring 4
Пабло Лозано

Він компілюється до версії 1.7, але немає підтримки функцій Java 8. Тож використання jdk 8 у цьому випадку не робить сенсу
stanislav.chetvertkov

Відповіді:


119

Як заявили @prunge та @Pablo Lozano, вам потрібна Spring 4, якщо ви хочете скомпілювати код на Java 8 (--target 1.8), але ви все одно можете запускати програми на Java 8, скомпільовані на Java 7, якщо ви працюєте на Spring 3.2.X.

Перевірте http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html

Зверніть увагу, що рівень байтового коду Java 8 (-target 1.8, як вимагає -source 1.8) повністю підтримується лише з Spring Framework 4.0. Зокрема, додатки на базі Spring 3.2 потрібно компілювати з максимальною ціллю Java 7, навіть якщо вони розгортаються в середовищі виконання Java 8. Будь ласка, перейдіть на Spring 4 для програм на базі Java 8.


Це спрацювало, дякую! Чомусь я пропустив реліз 4 весни :-)
stanislav.chetvertkov

2
Це трапляється і зі мною, навіть незважаючи на те, що код все ще скомпільований до цільової версії 1.7, я лише змінив час виконання на Java 8. Будь-які ідеї?
orrsella

1
Дивіться відповідь ItayK, є помилка навесні 3.2.8 і нижче, яка не використовуватиме правильну версію asm, вона виправлена ​​в 3.2.9-
chrismarx

2
У 3.2.10 була виправлена ​​ще одна помилка, тому я б рекомендував перейти на 3.2.16 або будь-яку останню версію. Ось ключові помилки Spring, які було виправлено: Читання метаданих ніколи не повинно використовувати ASM для типів java. * Та javax. * (Зокрема, на JDK 8) Java 8: Відвідувачі ASM5 необхідні для синтаксичного аналізу INVOKESPECIAL / STATIC на інтерфейсах
michaelok

Дякуємо, це спрацювало, зберігаючи <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> замість <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ашутош S

67

Якщо ви стикаєтесь з цією помилкою навіть при компіляції з -target 1.7, зауважте, що це через помилку у Spring Framework, яка змушує ASM classreader завантажувати класи jdk (java. * Або javax. *), Які, звичайно, компілюється з -target 1.8.

Це в поєднанні зі старою версією ASM навесні 3.2.8 і нижче, яка не підтримує синтаксичний аналіз файлів класу 1,8, також може призвести до цієї помилки.

Більше інформації про випуск можна знайти тут: https://jira.spring.io/browse/SPR-11719

Це слід виправити у версії 3.2.9 Spring Framework, яка має вийти найближчим часом.

Звичайно, оновлення до Spring Framework 4 також вирішить проблему, оскільки вона вже містить новішу версію ASM.

Однак, якщо з якихось причин ви поки не можете оновити версію 4, добре знати, що існує альтернатива (незабаром).


6
Мені допомогло оновлення до версії 3.2.9.
Ченгіз,

2
Це має бути прийнятою відповіддю, оскільки вона чітко пояснює, в чому проблема
Вілла

2
Якби цю проблему з Spring 3.2.5 змінили на 3.2.9 і вирішили проблему. Ідеальна відповідь.
Salvatorelab

Фу, рада, що мені не потрібно було переходити на весну 4. Чудова відповідь!
rudolfson

0

якщо ви використовуєте java 8 або наступну версію, вам потрібно оновити весняну версію, а весняна версія повинна бути 4.xxx


0

У мене була та ж проблема і я її вирішив. Я використовую spring 3.x з java 8. Якщо наведені вище рішення не працюють, змініть банки та перевірте, чи сумісні ці банки з версією java, яку ви використовуєте чи ні. spring 3.x не сумісний з java 8.


0

Spring 4 можна використовувати для Java 8 для вирішення цієї проблеми. Я просто перевірив це, і воно працює. Ця проблема вирішена з версії 3.2.9-RELEASE.

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