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

87

Мое веб-приложение отлично работает на JDK 1.7, но вылетает на 1.8 со следующим исключением (во время запуска сервера приложений с Jetty 8). Я использую версию Spring: 3.2.5.RELEASE.

Исключение:

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

Я предполагаю, что проблема возникает из-за Spring и библиотеки asm.jar, от которых она зависит.

Как мне решить эту проблему?

stanislav.chetvertkov
источник
Вы компилируете свое веб-приложение как Java 8 или Java 7? Если 8, должно быть возможно скомпилировать ваши классы, ориентированные на Java 7, но по-прежнему запускать их под Java 8.
p Гранж
3
Если вы хотите настроить таргетинг на Java8, вам понадобится Spring 4
Пабло Лозано
Он компилируется до версии 1.7, но не поддерживает функции java 8. Так что использование jdk 8 в этом случае не имеет смысла
stanislav.chetvertkov

Ответы:

119

Как заявили @parage и @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, в Spring 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>
Ashutosh S
67

Если вы столкнулись с этой ошибкой, даже если вы компилируете с -target 1.7, обратите внимание, что это из-за ошибки в Spring Framework, которая заставляет ASM classreader загружать классы jdk (java. * Или javax. *), Которые, конечно же, скомпилирован с -target 1.8.

Это в сочетании со старой версией ASM Spring 3.2.8 и ниже, которая не поддерживает синтаксический анализ файлов классов 1.8, также может привести к этой ошибке.

Более подробную информацию о проблеме можно найти здесь: https://jira.spring.io/browse/SPR-11719.

Это должно быть исправлено в Spring Framework версии 3.2.9, которая должна быть выпущена в ближайшее время.

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

Однако, если по какой-то причине вы еще не можете выполнить обновление до версии 4, хорошо знать, что есть альтернатива (скоро).

ИтайК
источник
6
Мне помогло обновление до Spring 3.2.9.
Дженгиз,
2
Это должен быть принятый ответ, потому что он четко объясняет, в чем проблема
Уилла,
2
Если бы эта проблема с Spring 3.2.5 была изменена на 3.2.9 и проблема решена. Прекрасный ответ.
Salvatorelab
Уф, рад, что мне не пришлось обновляться до Spring 4. Отличный ответ!
Рудольфсон
0

если вы используете java 8 или следующую версию, вам необходимо обновить весеннюю версию, а весенняя версия должна быть 4.xxx

Shafaetjsr
источник
0

У меня была такая же проблема, и я ее решил. Я использую spring 3.x с java 8. Если приведенные выше решения не работают, измените банки и найдите, совместимы ли эти банки с используемой версией java или нет. spring 3.x несовместима с java 8.

Рохан
источник
0

Spring 4 можно использовать для java 8, чтобы решить эту проблему. Я только что протестировал, и он работает. Эта проблема исправлена, начиная с версии Spring 3.2.9-RELEASE.

AdZzZ
источник