解决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

image
从maven官方来了解
image
image

结论:

  • 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 不一样)都打进去了。

解决方案

  1. 根据项目选择对应的版本:
    • 依据: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版本来选择。
  2. 在项目里面引入cglib的maven坐标:
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
</dependency>
  1. 更新项目的maven依赖,重新编译!
posted @ 2023-02-22 17:10  wandoubaguo  阅读(2883)  评论(0编辑  收藏  举报