Java 1.8 ASM ClassReader no pudo analizar el archivo de clase, probablemente debido a una nueva versión de archivo de clase de Java que aún no es compatible

87

Mi aplicación web funciona bien en JDK 1.7 pero falla en 1.8 con la siguiente excepción (durante el inicio del servidor de aplicaciones con Jetty 8). Estoy usando la versión de Spring: 3.2.5.RELEASE.

Excepción:

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

Supongo que el problema se produce debido a la primavera y la biblioteca "asm.jar" de la que depende.

¿Cómo resuelvo esto?

stanislav.chetvertkov
fuente
¿Está compilando su aplicación web como Java 8 o Java 7? Si es 8, debería ser posible compilar sus clases dirigidas a Java 7 pero aún ejecutarlo en Java 8.
prunge
3
Si desea apuntar a Java8, necesitará Spring 4
Pablo Lozano
Se compila en 1.7 pero no es compatible con las funciones de Java 8. Entonces, usar jdk 8 en este caso no tiene sentido
stanislav.chetvertkov

Respuestas:

119

Como indicaron @prunge y @Pablo Lozano, necesita Spring 4 si desea compilar código en Java 8 (--target 1.8), pero aún puede ejecutar aplicaciones en Java 8 compiladas en Java 7 si se ejecuta en Spring 3.2.X.

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

Tenga en cuenta que el nivel de código de bytes de Java 8 (-target 1.8, como lo requiere -source 1.8) solo es totalmente compatible a partir de Spring Framework 4.0. En particular, las aplicaciones basadas en Spring 3.2 deben compilarse con un máximo de Java 7 como destino, incluso si se implementan en un tiempo de ejecución de Java 8. Actualice a Spring 4 para aplicaciones basadas en Java 8.

Leszek Gruchała
fuente
¡Funcionó, gracias! Por alguna razón, me perdí el lanzamiento de Spring 4 :-)
stanislav.chetvertkov
2
Esto también me pasa a mí, aunque el código todavía está compilado para el objetivo 1.7, solo cambié el tiempo de ejecución para que sea java 8. ¿Alguna idea?
orrsella
1
Vea la respuesta de ItayK, hay un error en la primavera 3.2.8 y más abajo que no usará la versión de ASM correcta, se corrigió en 3.2.9-
chrismarx
2
Se corrigió otro error en 3.2.10, por lo que recomendaría ir con 3.2.16 o lo que sea más reciente. Estos son los errores clave de Spring que se solucionaron: La lectura de metadatos nunca debe usar ASM para los tipos java. * Y javax. * (En particular en JDK 8) Java 8: Se requieren visitantes de ASM5 para analizar INVOKESPECIAL / STATIC en interfaces
michaelok
Gracias, funcionó manteniendo <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> en lugar 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 encuentra este error incluso si compila con -target 1.7, tenga en cuenta que esto se debe a un error en Spring Framework que hace que el lector de clases ASM cargue clases jdk (java. * O javax. *), Que son, por supuesto, compilado con -target 1.8.

Esto, combinado con la versión anterior de ASM en la primavera 3.2.8 e inferior, que no admite el análisis de archivos de clase 1.8, también puede provocar este error.

Puede encontrar más información sobre el problema aquí: https://jira.spring.io/browse/SPR-11719

Esto debería corregirse en Spring Framework versión 3.2.9, que se lanzará pronto.

Por supuesto, la actualización a Spring Framework 4 también resolverá el problema, ya que ya contiene una versión más nueva de ASM.

Sin embargo, si por alguna razón no puede actualizar a la versión 4 todavía, es bueno saber que hay una alternativa (pronto).

ItayK
fuente
6
La actualización a Spring 3.2.9 me ayudó.
Cengiz
2
Esta debería ser la respuesta aceptada porque explica claramente cuál es el problema
Willa
2
Tuve este problema con Spring 3.2.5, cambió a 3.2.9 y problema resuelto. Respuesta perfecta.
Salvatorelab
Uf, me alegro de no haber tenido que actualizar a Spring 4. ¡Excelente respuesta!
Rudolfson
0

si usa java 8 o la próxima versión, necesita actualizar la versión de primavera y la versión de primavera debe ser 4.xxx

shafaetjsr
fuente
0

Tuve el mismo problema y lo resolví. Estoy usando Spring 3.x con Java 8. Si las soluciones anteriores no funcionan, cambie los frascos y busque si esos frascos son compatibles con la versión de Java que está utilizando o no. spring 3.x no es compatible con java 8.

rohan
fuente
0

Spring 4 se puede utilizar para Java 8 para resolver este problema. Lo acabo de probar y funciona. Este problema está solucionado desde la versión Spring 3.2.9-RELEASE.

AdZzZ
fuente