在网上下载了一个开源的项目(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都行