解决java.lang.NoClassDefFoundError:Could not initialize class net.sf.cglib.beans.BeanMap$Generator?异常
异常描述
项目引入Alibaba的EasyExcel工具,编译没有报错,在请求导出Excel文件的接口时,log异常出现以下错误java.lang.NoClassDefFoundError:Could not initialize class net.sf.cglib.beans.BeanMap$Generator
异常分析
java.lang.NoClassDefFoundError:无法初始化类net.sf.cglib.beans.BeanMap$Generator。 一般遇到NoClassDefFoundError类似的异常时,大多数都是因为jar包冲突引起的。
查看到日志详情信息
class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class
tips:ClassVisitor 定义的是一个 interface,但是现在却作为一个父类(super class)被其它类继承了。
classVisitor在一个jar包中是一个接口,在另一个jar包中却是class
从maven官方来了解
结论:
- asm 包从 3.3.1 往后,gropuId 发生了变更(由asm 变更 org.ow2.asm);
- 由于项目使用的 springboot 版本是 2.0.0,需要依赖 asm3.0,easyexcel 2.1.6 依赖的是 asm 4.2;
- 导致 Maven 在打包的时候将这两个 asm包( artifactId 一样,但groupId 不一样)都打进去了。
解决方案
- 根据项目选择对应的版本:
- 依据:class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class 根据当前项目 springboot 版本是 2.0.0,需要选择的是asm 3.1,所以asm的上级包cglib 2.2。
- tips:请结合项目的springboot版本来选择。
- 在项目里面引入cglib的maven坐标:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
- 更新项目的maven依赖,重新编译!