Java 1.8 ASM ClassReader n'a pas réussi à analyser le fichier de classe - probablement en raison d'une nouvelle version de fichier de classe Java qui n'est pas encore prise en charge

87

Mon application Web fonctionne correctement sur JDK 1.7 mais plante sur 1.8 avec l'exception suivante (lors du démarrage du serveur d'applications avec Jetty 8). J'utilise la version Spring: 3.2.5.RELEASE.

Exception:

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

Je suppose que ce problème se produit à cause du ressort et de la bibliothèque "asm.jar" dont il dépend.

Comment résoudre ça?

stanislav.chetvertkov
la source
Compilez-vous votre application Web en Java 8 ou Java 7? Si 8, il devrait être possible de compiler vos classes ciblant Java 7 mais toujours de l'exécuter sous Java 8.
Prunge
3
Si vous voulez cibler Java8, vous aurez besoin de Spring 4
Pablo Lozano
Il compile vers 1.7 mais il n'y a pas de support pour les fonctionnalités de java 8. Donc, utiliser jdk 8 dans ce cas ne fait pas sens
stanislav.chetvertkov

Réponses:

119

Comme l'ont déclaré @prunge et @Pablo Lozano, vous avez besoin de Spring 4 si vous voulez compiler du code vers Java 8 (--target 1.8), mais vous pouvez toujours exécuter des applications sur Java 8 compilées vers Java 7 si vous exécutez sur Spring 3.2.X.

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

Notez que le niveau de bytecode Java 8 (-target 1.8, comme requis par -source 1.8) n'est entièrement pris en charge qu'à partir de Spring Framework 4.0. En particulier, les applications basées sur Spring 3.2 doivent être compilées avec un maximum de Java 7 comme cible, même si elles sont déployées sur un environnement d'exécution Java 8. Veuillez mettre à niveau vers Spring 4 pour les applications basées sur Java 8.

Leszek Gruchała
la source
Cela a fonctionné, merci! Pour une raison quelconque, j'ai manqué la sortie du printemps 4 :-)
stanislav.chetvertkov
2
Cela m'arrive aussi, même si le code est toujours compilé vers la cible 1.7, j'ai seulement changé le runtime pour être java 8. Des idées?
orrsella
1
Voir la réponse d'ItayK, il y a un bogue au printemps 3.2.8 et ci-dessous qui n'utilise pas la bonne version asm, il est corrigé dans 3.2.9-
chrismarx
2
Il y a eu un autre bogue corrigé dans la version 3.2.10, je vous recommande donc d'utiliser la version 3.2.16 ou toute autre version la plus récente. Voici les principaux bogues de Spring qui ont été corrigés: La lecture des métadonnées ne doit jamais utiliser ASM pour les types java. * Et javax. * (En particulier sur JDK 8) Java 8: visiteurs ASM5 requis pour analyser INVOKESPECIAL / STATIC sur les interfaces
Michaelok
Merci, cela a fonctionné en gardant <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> au lieu de <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ashutosh S
67

Si vous rencontrez cette erreur même si vous compilez avec -target 1.7, veuillez noter que cela est dû à un bogue dans Spring Framework qui oblige le classreader ASM à charger des classes jdk (java. * Ou javax. *), Qui sont, bien sûr, compilé avec -target 1.8.

Ceci, combiné à l'ancienne version ASM du printemps 3.2.8 et inférieur, qui ne prend pas en charge l'analyse des fichiers de classe 1.8, peut également conduire à cette erreur.

Plus d'informations sur le problème sont disponibles ici: https://jira.spring.io/browse/SPR-11719

Cela devrait être corrigé dans Spring Framework version 3.2.9, qui devrait être publié prochainement.

Bien sûr, la mise à niveau vers Spring Framework 4 résoudra également le problème, car il contient déjà une version plus récente d'ASM.

Cependant, si pour une raison quelconque vous ne pouvez pas encore mettre à niveau vers la version 4, il est bon de savoir qu'il existe une alternative (bientôt).

ItayK
la source
6
La mise à niveau vers Spring 3.2.9 m'a aidé.
Cengiz le
2
Cela devrait être la réponse acceptée car elle explique clairement quel est le problème
Willa
2
Avait ce problème avec Spring 3.2.5, changé en 3.2.9 et problème résolu. Réponse parfaite.
Salvatorelab
Ouf, content de ne pas avoir besoin de passer au printemps 4. Excellente réponse!
rudolfson
0

si vous utilisez java 8 ou la version suivante, vous devez mettre à niveau la version de printemps et la version de printemps doit être 4.xxx

shafaetjsr
la source
0

J'ai eu le même problème et je l'ai résolu. J'utilise spring 3.x avec java 8. Si les solutions ci-dessus ne fonctionnent pas, changez les jars et recherchez si ces jars sont compatibles avec la version java que vous utilisez ou non. spring 3.x n'est pas compatible avec java 8.

Rohan
la source
0

Spring 4 peut être utilisé pour java 8 pour résoudre ce problème. Je viens de le tester et ça marche. Ce problème est résolu depuis la version Spring 3.2.9-RELEASE.

AdZzZ
la source