Java 1.8 ASM ClassReader non è riuscito ad analizzare il file di classe, probabilmente a causa di una nuova versione del file di classe Java che non è ancora supportata


87

La mia applicazione web funziona bene su JDK 1.7 ma si arresta in modo anomalo su 1.8 con la seguente eccezione (durante l'avvio del server delle applicazioni con Jetty 8). Sto usando la versione Spring: 3.2.5.RELEASE.

Eccezione:

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

Presumo che il problema si verifichi a causa della primavera e della libreria "asm.jar" da cui dipende.

Come risolvo questo problema?


Stai compilando la tua webapp come Java 8 o Java 7? Se 8, dovrebbe essere possibile compilare le classi indirizzate a Java 7 ma eseguirlo comunque sotto Java 8.
prunge

3
Se vuoi scegliere come target Java8 avrai bisogno di Spring 4
Pablo Lozano

Si compila a 1.7 ma non c'è supporto per le funzionalità di Java 8. Quindi usare jdk 8 in questo caso non ha senso
stanislav.chetvertkov

Risposte:


119

Come hanno affermato @prunge e @Pablo Lozano, è necessario Spring 4 se si desidera compilare il codice per Java 8 (--target 1.8), ma è comunque possibile eseguire app su Java 8 compilate su Java 7 se si esegue Spring 3.2.X.

Dai un'occhiata a http://docs.spring.io/spring/docs/current/spring-framework-reference/html/new-in-4.0.html

Si noti che il livello di bytecode Java 8 (-target 1.8, come richiesto da -source 1.8) è completamente supportato solo a partire da Spring Framework 4.0. In particolare, le applicazioni basate su Spring 3.2 devono essere compilate con un massimo di Java 7 come destinazione, anche se vengono distribuite su un runtime Java 8. Aggiornare a Spring 4 per applicazioni basate su Java 8.


Ha funzionato, grazie! Per qualche motivo mi sono perso il rilascio della primavera 4 :-)
stanislav.chetvertkov

2
Questo succede anche a me, anche se il codice è ancora compilato per target 1.7, ho solo cambiato il runtime in java 8. Qualche idea?
orrsella

1
Vedi la risposta di ItayK, c'è un bug nella primavera 3.2.8 e sotto che non userà la versione asm corretta, è stato risolto in 3.2.9-
chrismarx

2
C'è stato un altro bug corretto nella 3.2.10, quindi consiglierei di andare con 3.2.16 o qualunque sia l'ultimo. Ecco i principali bug di Spring che sono stati corretti: La lettura dei metadati non dovrebbe mai usare ASM per i tipi java. * E javax. * (In particolare su JDK 8) Java 8: visitatori ASM5 richiesti per l'analisi di INVOKESPECIAL / STATIC sulle interfacce
michaelok

Grazie, ha funzionato mantenendo <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> invece di <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ashutosh S

67

Se riscontri questo errore anche se compili con -target 1.7, tieni presente che ciò è dovuto a un bug in Spring Framework che causa il caricamento di classi jdk da parte di ASM classreader (java. * O javax. *), Che sono, ovviamente, compilato con -target 1.8.

Questo, combinato con la vecchia versione ASM nella primavera 3.2.8 e successive, che non supporta l'analisi dei file di classe 1.8, può anche portare a questo errore.

Maggiori informazioni sul problema sono disponibili qui: https://jira.spring.io/browse/SPR-11719

Questo dovrebbe essere corretto nella versione 3.2.9 di Spring Framework, che dovrebbe essere rilasciata presto.

Ovviamente, anche l'aggiornamento a Spring Framework 4 risolverà il problema, poiché contiene già una versione più recente di ASM.

Tuttavia, se per qualche motivo non è ancora possibile eseguire l'aggiornamento alla versione 4, è bene sapere che c'è un'alternativa (presto).


6
L'aggiornamento alla primavera 3.2.9 mi ha aiutato.
Cengiz

2
Questa dovrebbe essere la risposta accettata perché spiega chiaramente qual è il problema
Willa

2
Aveva questo problema con Spring 3.2.5, modificato in 3.2.9 e risolto. Risposta perfetta.
Salvatorelab

Uff, contento di non aver bisogno di passare alla primavera 4. Ottima risposta!
Rudolfson

0

se usi java 8 o la versione successiva devi aggiornare la versione primaverile e la versione primaverile dovrebbe essere 4.xxx


0

Ho avuto lo stesso problema e l'ho risolto. Sto usando la primavera 3.x con java 8. Se le soluzioni di cui sopra non funzionano, cambia i jar e cerca se quei jar sono compatibili con la versione java che stai usando o meno. spring 3.x non è compatibile con java 8.


0

Spring 4 può essere utilizzato per Java 8 per risolvere questo problema. L'ho appena testato e funziona. Questo problema è stato risolto dalla versione Spring 3.2.9-RELEASE.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.