Java 1.8 ASM ClassReader nie przeanalizowała pliku klasy - prawdopodobnie z powodu nowej wersji pliku klasy Java, która nie jest jeszcze obsługiwana

87

Moja aplikacja internetowa działa poprawnie w JDK 1.7, ale ulega awarii w 1.8 z następującym wyjątkiem (podczas uruchamiania serwera aplikacji z Jetty 8). Używam wersji Spring: 3.2.5.RELEASE.

Wyjątek:

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

Zakładam, że problem występuje z powodu sprężyny i biblioteki „asm.jar”, ​​od której to zależy.

Jak mam to rozwiązać?

stanislav.chetvertkov
źródło
Czy kompilujesz swoją aplikację internetową jako Java 8 czy Java 7? Jeśli 8, powinno być możliwe skompilowanie klas pod
kątem
3
Jeśli chcesz kierować reklamy na Java8, będziesz potrzebować wiosny 4
Pablo Lozano,
Kompiluje się do wersji 1.7, ale nie ma wsparcia dla funkcji Java 8. Więc użycie jdk 8 w tym przypadku nie ma sensu
stanislav.chetvertkov

Odpowiedzi:

119

Jak stwierdzili @prunge i @Pablo Lozano, potrzebujesz Spring 4, jeśli chcesz skompilować kod do Java 8 (--target 1.8), ale nadal możesz uruchamiać aplikacje na Javie 8 skompilowanej do Java 7, jeśli uruchomisz na Spring 3.2.X.

Sprawdź http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html

Zwróć uwagę, że poziom kodu bajtowego Java 8 (-target 1.8, zgodnie z wymaganiami -source 1.8) jest w pełni obsługiwany tylko od Spring Framework 4.0. W szczególności aplikacje oparte na Spring 3.2 muszą zostać skompilowane z maksymalnie Java 7 jako celem, nawet jeśli zdarzy się, że zostaną wdrożone w środowisku wykonawczym Java 8. Uaktualnij do wersji Spring 4 dla aplikacji opartych na Javie 8.

Leszek Gruchała
źródło
Udało się, dzięki! Z jakiegoś powodu przegapiłem wydanie wiosenne 4 :-)
stanislav.chetvertkov
2
Mnie też się to zdarza, mimo że kod jest nadal skompilowany do celu 1.7, zmieniłem tylko środowisko wykonawcze na java 8. Jakieś pomysły?
orrsella
1
Zobacz odpowiedź ItayK, na wiosnę 3.2.8 i poniżej jest błąd, który nie będzie używał właściwej wersji ASM, został naprawiony w 3.2.9-
chrismarx
2
W wersji 3.2.10 został naprawiony inny błąd, więc polecam wersję 3.2.16 lub cokolwiek innego. Oto główne błędy Springa, które zostały naprawione: Odczyt metadanych nigdy nie powinien używać ASM dla typów java. * I javax. * (W szczególności w JDK 8) Java 8: goście ASM5 wymagane do parsowania INVOKESPECIAL / STATIC na interfejsach
michaelok
Dzięki, zadziałało dzięki zachowaniu <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> zamiast <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ashutosh S
67

Jeśli napotkasz ten błąd, nawet jeśli kompilujesz z -target 1.7, pamiętaj, że jest to spowodowane błędem w Spring Framework, który powoduje, że czytnik klas ASM ładuje klasy jdk (java. * Lub javax. *), Którymi są oczywiście skompilowane z -target 1.8.

To, w połączeniu ze starą wersją ASM na wiosnę 3.2.8 i poniżej, która nie obsługuje parsowania plików klasy 1.8, również może prowadzić do tego błędu.

Więcej informacji o problemie można znaleźć tutaj: https://jira.spring.io/browse/SPR-11719

Powinno to zostać naprawione w Spring Framework w wersji 3.2.9, która ma się wkrótce ukazać.

Oczywiście uaktualnienie do Spring Framework 4 również rozwiąże problem, ponieważ zawiera już nowszą wersję ASM.

Jeśli jednak z jakiegoś powodu nie możesz jeszcze zaktualizować do wersji 4, dobrze jest wiedzieć, że istnieje alternatywa (wkrótce).

ItayK
źródło
6
Aktualizacja do Spring 3.2.9 pomogła mi.
Cengiz
2
To powinna być akceptowana odpowiedź, ponieważ jasno wyjaśnia, o co chodzi
Willa
2
Miałem ten problem w Spring 3.2.5, zmieniono na 3.2.9 i problem został rozwiązany. Doskonała odpowiedź.
Salvatorelab
Uff, cieszę się, że nie musiałem przechodzić na wiosnę 4. Świetna odpowiedź!
rudolfson
0

jeśli używasz java 8 lub nowszej wersji, musisz zaktualizować wersję wiosenną, a wersja wiosenna powinna być 4.xxx

shafaetjsr
źródło
0

Miałem ten sam problem i rozwiązałem go. Używam spring 3.x z java 8. Jeśli powyższe rozwiązania nie działają, zmień jars i wyszukaj, czy te słoiki są kompatybilne z używaną wersją java, czy nie. Spring 3.x nie jest kompatybilny z java 8.

rohan
źródło
0

Spring 4 może być używany w java 8, aby rozwiązać ten problem. Właśnie to przetestowałem i działa. Ten problem został rozwiązany od wersji Spring 3.2.9-RELEASE.

AdZzZ
źródło