EasyExcel依赖asm包冲突问题解决

问题现象

项目场景:

项目组对现有单体应用进行微服务拆分,拆分后部署到测试环境,进行全流程拉通,测试导入Excel,解析失败,交易终端。
在拆分前功能是OK的,微服务拆分后对Pom依赖关系包结构整体进行了调整。
SpringBoot集成EasyExcel,在导入Excel进行解析处理时,执行到doReadSync()时报错,提示java.lang.IncompatibleClassChangeError或者net.sf.cglib.beans.beanMap not found

问题描述:

报错日志

com.alibaba.excel.exception.ExcelAnalysisException: java.lang.IncompatibleClassChangeError: class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:126) at com.alibaba.excel.ExcelReader.read(ExcelReader.java:182) at com.alibaba.excel.ExcelReader.read(ExcelReader.java:172) at com.alibaba.excel.read.builder.ExcelReaderSheetBuilder.doReadSync(ExcelReaderSheetBuilder.java:80) at com.pab.fb.comb.account.open.service.batch.service.impl.BatchOpenAcctServiceImpl.importExcel(BatchOpenAcctServiceImpl.java:179) at com.pab.fb.comb.account.open.controller.batch.BatchOpenAcctController.uploadFile(BatchOpenAcctController.java:54) at com.pab.fb.comb.account.open.controller.batch.BatchOpenAcctController$$FastClassBySpringCGLIB$$5e8ec8cb.invoke

错误代码

List allList = EasyExcel.read(new BufferedInputStream(file.getInputStream()), listener).autoCloseStream(true).head(BoaExcelModel.class).sheet(0).doReadSync();

原因分析:

因为当前版本并无实际业务代码改动,基本确定就是微服务拆分的解耦拆包导致的jar包冲突,
1)查看代码实际引用的ClassVisitor的确是抽象类,非接口,基本确定asm有jar包冲突,导致cglib依赖到的版本非easyexcel指定版本导致
2)下载测试环境jar包查看依赖的asm是否有其余版本(下载后如图,的确存在两个版本asm-3.3.1和asm-5.0.4)[实际问题不是此处发现的asm两个版本问题,后面可以看到]
在这里插入图片描述

3)在Maven中查看相关依赖关系,此处最好使用Idea的Maven插件,我这里使用的是Maven Dependency Helper和Maven Helper。可以查看到实际问题是easyexcel和hystrix主要冲突导致,4.2和5.0.4结构变化导致。接下来就是解决版本不一致问题。
asm依赖

解决方案:

可以看到easyexcel使用的cglib版本是3.1,asm版本应该是4.0.2,而现在的问题是asm4.0.2版本被5.0.4冲突覆盖掉升级了。采用如下策略
cglib版本
1)降级asm5.0.4到4.2,或者关联hystrix的进行降级,查看hystrix相关功能是否受影响。为了查看是否有关联影响,我下载了Springcloud hystrix的相关版本源码查看具体使用asm的代码有多少,是否受影响。查看依赖后,主要还是ClasVisitor发生了变化。[方案1不可行]
在这里插入图片描述在这里插入图片描述

2)[网上解决方案]直接升级asm到5.2,asm官方在5.2版本后解决该问题。[方案2不可行,5.2版本依然冲突]
3)降级easyexcel,使用2.0.5版本,该版本的cglib是2.2.2版本,牺牲easyexcel的功能点。[不推荐]
4)直接指定cglib到框架依赖的版本2.2.2,这样easyexcel依赖的asm自动变成低版本。[有效,不影响easyexcel的使用,升级后依赖如下]
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lxn1023143182/article/details/112058288