Java 1.8 ASM ClassReader konnte die Klassendatei nicht analysieren - wahrscheinlich aufgrund einer neuen Java-Klassendateiversion, die noch nicht unterstützt wird

87

Meine Webanwendung läuft unter JDK 1.7 einwandfrei, stürzt jedoch mit der folgenden Ausnahme unter 1.8 ab (beim Start des Anwendungsservers mit Jetty 8). Ich verwende die Spring-Version: 3.2.5.RELEASE.

Ausnahme:

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

Ich gehe davon aus, dass das Problem aufgrund der Bibliothek spring und "asm.jar" auftritt, von der es abhängt.

Wie löse ich das?

stanislav.chetvertkov
quelle
Kompilieren Sie Ihre Webanwendung als Java 8 oder Java 7? Wenn 8, sollte es möglich sein, Ihre Klassen für Java 7 zu kompilieren, aber dennoch unter Java 8
auszuführen
3
Wenn Sie auf Java8 abzielen möchten, benötigen Sie Spring 4
Pablo Lozano
Es wird auf 1.7 kompiliert, aber es gibt keine Unterstützung für Java 8-Funktionen. Die Verwendung von JDK 8 in diesem Fall macht also keinen Sinn
stanislav.chetvertkov

Antworten:

119

Wie @prunge und @Pablo Lozano angegeben haben, benötigen Sie Spring 4, wenn Sie Code nach Java 8 kompilieren möchten (--target 1.8). Sie können jedoch weiterhin Apps auf Java 8 ausführen, die auf Java 7 kompiliert wurden, wenn Sie Spring 3.2.X ausführen.

Überprüfen Sie http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html

Beachten Sie, dass die Java 8-Bytecode-Ebene (-target 1.8, wie von -source 1.8 gefordert) erst ab Spring Framework 4.0 vollständig unterstützt wird. Insbesondere müssen Spring 3.2-basierte Anwendungen mit maximal Java 7 als Ziel kompiliert werden, selbst wenn sie zufällig auf einer Java 8-Laufzeit bereitgestellt werden. Bitte aktualisieren Sie auf Spring 4 für Java 8-basierte Anwendungen.

Leszek Gruchała
quelle
Es hat funktioniert, danke! Aus irgendeinem Grund habe ich die Veröffentlichung von Spring 4 verpasst :-)
stanislav.chetvertkov
2
Dies passiert mir auch, obwohl der Code immer noch auf Ziel 1.7 kompiliert ist, habe ich nur die Laufzeit in Java 8 geändert. Irgendwelche Ideen?
Orrsella
1
Siehe ItayKs Antwort, es gibt einen Fehler im Frühjahr 3.2.8 und darunter, der nicht die richtige asm-Version verwendet. Er wurde in 3.2.9-
chrismarx
2
In 3.2.10 wurde ein weiterer Fehler behoben, daher würde ich empfehlen, 3.2.16 oder was auch immer die neueste ist. Hier sind die wichtigsten Spring-Fehler, die behoben wurden: Das Lesen von Metadaten sollte niemals ASM für Java. * Und Javax. * -Typen verwenden (insbesondere in JDK 8). Java 8: ASM5-Besucher, die zum Parsen von INVOKESPECIAL / STATIC auf Schnittstellen erforderlich sind
michaelok
Vielen Dank, es hat funktioniert, indem <groupId> org.apache.maven.plugins </ groupId> <artifactId> maven-compiler-plugin </ifactId> <configuration> <source> 1.7 </ source> <target> 1.7 </ beibehalten wurde Ziel> </ configuration> anstelle von <groupId> org.apache.maven.plugins </ groupId> <artifactId> Maven-Compiler-Plugin </ifactId> <configuration> <source> 1.8 </ source> <target> 1.8 < / target> </ configuration>
Ashutosh S
66

Wenn dieser Fehler auch beim Kompilieren mit -target 1.7 auftritt, beachten Sie bitte, dass dies auf einen Fehler in Spring Framework zurückzuführen ist, der dazu führt, dass ASM-Klassenleser JDK-Klassen (Java. * Oder Javax. *) Lädt, was natürlich der Fall ist kompiliert mit -target 1.8.

Dies kann in Kombination mit der alten ASM-Version im Frühjahr 3.2.8 und niedriger, die das Parsen von Dateien der Klasse 1.8 nicht unterstützt, ebenfalls zu diesem Fehler führen.

Weitere Informationen zu diesem Problem finden Sie hier: https://jira.spring.io/browse/SPR-11719

Dies sollte in Spring Framework Version 3.2.9 behoben werden, die in Kürze veröffentlicht wird.

Ein Upgrade auf Spring Framework 4 behebt natürlich auch das Problem, da es bereits eine neuere Version von ASM enthält.

Wenn Sie jedoch aus irgendeinem Grund noch kein Upgrade auf Version 4 durchführen können, ist es gut zu wissen, dass es (bald) eine Alternative gibt.

ItayK
quelle
6
Ein Upgrade auf Spring 3.2.9 hat mir geholfen.
Cengiz
2
Dies sollte die akzeptierte Antwort sein, da sie klar erklärt, worum es geht
Willa
2
Hatte dieses Problem mit Spring 3.2.5, geändert auf 3.2.9 und Problem gelöst. Perfekte Antwort.
Salvatorelab
Puh, ich bin froh, dass ich nicht auf Spring 4 upgraden musste. Tolle Antwort!
Rudolfson
0

Wenn Sie Java 8 oder die nächste Version verwenden, müssen Sie die Spring-Version aktualisieren. Die Spring-Version sollte 4.xxx sein

shafaetjsr
quelle
0

Ich hatte das gleiche Problem und löste es. Ich verwende Spring 3.x mit Java 8. Wenn die oben genannten Lösungen nicht funktionieren, ändern Sie die Gläser und suchen Sie, ob diese Gläser mit der von Ihnen verwendeten Java-Version kompatibel sind oder nicht. spring 3.x ist nicht kompatibel mit java 8.

Rohan
quelle
0

Spring 4 kann für Java 8 verwendet werden, um dieses Problem zu beheben. Ich habe es gerade getestet und es funktioniert. Dieses Problem wurde seit der Version Spring 3.2.9-RELEASE behoben.

AdZzZ
quelle