Java 1.8 ASM ClassReader falhou ao analisar o arquivo de classe - provavelmente devido a uma nova versão do arquivo de classe Java que ainda não é compatível

87

Meu aplicativo da web funciona bem no JDK 1.7, mas trava no 1.8 com a seguinte exceção (durante a inicialização do servidor de aplicativos com Jetty 8). Estou usando a versão Spring: 3.2.5.RELEASE.

Exceção:

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 que o problema ocorra por causa da biblioteca spring e "asm.jar" da qual depende.

Como faço para resolver isso?

stanislav.chetvertkov
fonte
Você está compilando seu webapp como Java 8 ou Java 7? Se for 8, deve ser possível compilar suas classes visando Java 7, mas ainda executá-lo no Java 8.
prunge
3
Se você deseja direcionar o Java8, você precisará do Spring 4
Pablo Lozano
Compila para 1.7, mas não há suporte para recursos do java 8. Portanto, usar o jdk 8 neste caso não faz sentido
stanislav.chetvertkov

Respostas:

119

Como @prunge e @Pablo Lozano declararam, você precisa do Spring 4 se quiser compilar o código para Java 8 (--target 1.8), mas ainda pode executar aplicativos em Java 8 compilados para Java 7 se executar no Spring 3.2.X.

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

Observe que o nível de bytecode Java 8 (-target 1.8, conforme exigido pela -source 1.8) só é totalmente suportado a partir do Spring Framework 4.0. Em particular, os aplicativos baseados em Spring 3.2 precisam ser compilados com no máximo Java 7 como destino, mesmo se forem implementados em um Java 8 runtime. Atualize para o Spring 4 para aplicativos baseados em Java 8.

Leszek Gruchała
fonte
Funcionou, obrigado! Por alguma razão, perdi o lançamento da primavera 4 :-)
stanislav.chetvertkov
2
Isso acontece comigo também, embora o código ainda esteja compilado para o destino 1.7, eu apenas alterei o tempo de execução para ser java 8. Alguma ideia?
orrsella
1
Veja a resposta de ItayK, há um bug na primavera 3.2.8 e abaixo que não usa a versão asm correta, foi corrigido em 3.2.9-
chrismarx
2
Houve outro bug corrigido no 3.2.10, então eu recomendo ir para o 3.2.16 ou o que for mais recente. Aqui estão os principais bugs do Spring que foram corrigidos: A leitura de metadados nunca deve usar ASM para tipos java. * E javax. * (Em particular no JDK 8) Java 8: Visitantes ASM5 necessários para analisar INVOKESPECIAL / STATIC em interfaces
michaelok
Obrigado ,, funcionou mantendo <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.7 </source> <target> 1.7 </ target> </configuration> em vez de <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.8 </source> <target> 1.8 < / target> </configuration>
Ashutosh S de
67

Se você encontrar esse erro mesmo se compilar com -target 1.7, observe que isso se deve a um bug no Spring Framework que faz com que o leitor de classes ASM carregue classes jdk (java. * Ou javax. *), Que são, é claro, compilado com -target 1.8.

Isso, combinado com a versão antiga do ASM na primavera 3.2.8 e abaixo, que não suporta a análise de arquivos de classe 1.8, também pode levar a este erro.

Mais informações sobre o assunto podem ser encontradas aqui: https://jira.spring.io/browse/SPR-11719

Isso deve ser corrigido no Spring Framework versão 3.2.9, que será lançado em breve.

Obviamente, atualizar para Spring Framework 4 também resolverá o problema, pois ele já contém uma versão mais recente do ASM.

No entanto, se por algum motivo você ainda não puder atualizar para a versão 4, é bom saber que há uma alternativa (em breve).

ItayK
fonte
6
Atualizar para o Spring 3.2.9 me ajudou.
Cengiz,
2
Esta deve ser a resposta aceita porque explica claramente qual é o problema
Willa
2
Tive esse problema com o Spring 3.2.5, mudei para 3.2.9 e o problema foi resolvido. Resposta perfeita.
Salvatorelab de
Ufa, feliz por não precisar atualizar para o Spring 4. Ótima resposta!
rudolfson
0

se você usa java 8 ou a próxima versão, você precisa atualizar a versão primavera e a versão primavera deve ser 4.xxx

shafaetjsr
fonte
0

Eu tive o mesmo problema e resolvi. Estou usando spring 3.x com java 8. Se as soluções acima não estiverem funcionando, altere os jars e pesquise se esses jars são compatíveis com a versão java que você está usando ou não. spring 3.x não é compatível com java 8.

Rohan
fonte
0

Spring 4 pode ser usado para java 8 para resolver esse problema. Acabei de testar e funciona. Este problema foi corrigido desde a versão Spring 3.2.9-RELEASE.

AdZzZ
fonte