在网上下载了一个开源的项目(Maven项目),导入到eclipse后,各项配置也正常,启动碰到了一个异常:ASM ClassReader failed to parse class file,分析并解决之。

1.  环境信息:
Spring 3.2.8, JDK 1.8, SpringMVC,mybatis3.2.1

2.  运行简单的程序,出现以下错误信息:
nested exception is 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: file [D:\WorkSpaces\luna\target\test-classes\oauthdemo\oauth2
\oauthTest.class]; 
nested exception is java.lang.IllegalArgumentException.  

3. 问题分析
    “ASM ClassReader failed to parse class file”是其中主要的原因。检查Maven的类库,没有发现问题,无asm显性依赖,其依赖产生于spring本身。故分析有可能是spring本身的问题造成了;但是这么流行的spring,怎么会出错了,我不能这么牛x碰到这么简单的问题吧?
     难道是版本?除了版本之外,spring无大区别。经过一般Google搜索,网上还真有类似的问题:
Note that the Java 8 bytecode level (-target 1.8, as required by -source 1.8) is only 
fully supported  as of Spring Framework 4.0.    
In particular, Spring 3.2 based applications need to be compiled with a maximum of Java 7 
as the target,  even if they happen to be deployed onto a Java 8 runtime. 
Please upgrade to Spring 4 for Java  8 based applications. 
          所以,看明白了吧,Java8字节码级别只完全支持从Spring Framework 4.0开始的版本,基于spring3.2的应用程序最高支持到Java 7的编译级别,即使该应用碰巧被部署在Java 8的运行时环境里(也是最高支持到Java7)”。所以归根结底是 jdk版本与Spring版本不搭配所致,方案有两条
  a.  使用jdk1.7  
  b.  升级spring版本为 4.0

4.  问题解决
  最终选择了升级了Spring4.2.0, 然后问题解决。

5. 总结
    jdk1.8只支持Spring4.0以上版本,因为有一些新特性,老版本的Spring不支持。如果使用jdk1.7,那么Spring3.2以上就可以了。
反正搭配就是: jdk1.8 <--搭配--> Spring4.0及以上; 
                          jdk1.7 <--搭配--> Spring3.2.x,Spring4.x.x都行


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐