#commons-pool2-2.3 jar包
#commons-pool2-2.3 jar包
上一篇文章 Maven项目为什么会产生的jar包冲突 结合了大量的图解,详细介绍了Maven项目产生jar包冲突的原因,以及为什么在编译的时候不报错,在运行的时候会报错的场景分析;
本篇记录一下在项目开发中使用的开源组件做excel文件上传和下载功能时,遇到的一个jar包冲突问题的排查思路和解决办法。
|一. 问题现象
在使用的工具开发excel的上传和下载功能时,本机环境测试没有问题,部署到测试环境时,却发现下载excel文件的功能一直异常,查看后台服务报错日志如下:
nested exception is com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.beans.BeanMap$Generator] with root cause]java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.beans.BeanMap$Generator
上一篇 Maven项目为什么会产生的jar包冲突 时 已经介绍过,看到 类似的异常时,大多数都是因为jar包冲突引起的。
|二. 问题排查流程
由于本地开发环境无法浮现,所以只能从测试环境着手排查。
1. 解压jar包
登录项目部署的容器#commons-pool2-2.3 jar包,解压项目jar包,将解压后的文件放入 app 文件夹里:
[root@08e08117bd99 /]# cd /data/application/java[root@08e08117bd99 /data/application/java]# unzip app.jar -d app/
2. 查找jar包里有没有cglib.beans.类
进入解压后的 app 目录,查找 cglib 包:
[root@08e08117bd99 /data/application/java]# cd /app/BOOT-INF/lib$ ls -l | grep cglib-rw-r--r-- 1 root root 283080 Dec 7 2013 cglib-3.1.jar# 继续解压cglib包[root@08e08117bd99 /data/application/java/app/BOOT-INF/lib]# unzip -l cglib-3.1.jar | grep BeanMap 336 12-07-2013 11:28 net/sf/cglib/beans/BeanMap$Generator$BeanMapKey.class 3219 12-07-2013 11:28 net/sf/cglib/beans/BeanMap$Generator.class 5008 12-07-2013 11:28 net/sf/cglib/beans/BeanMap.class 1825 12-07-2013 11:28 net/sf/cglib/beans/BeanMapEmitter$1.class 2090 12-07-2013 11:28 net/sf/cglib/beans/BeanMapEmitter$2.class 1546 12-07-2013 11:28 net/sf/cglib/beans/BeanMapEmitter$3.class 6339 12-07-2013 11:28 net/sf/cglib/beans/BeanMapEmitter.class
发现解压后的 jar包里是存在cglib.beans.$这个类。
3. 继续看其它错误日志
继续看错误日志#commons-pool2-2.3 jar包,发现这段:
class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class
大概意思是:

定义的是一个 ,但是现在却作为一个父类(super class)被其它类继承了。
这种情况表明java could initialize,此时应该存在jar包冲突了:
4. 从刚刚解压的项目jar包里查找asm包
由于这个报错信息里包含asm,所以尝试查找包含asm的jar包:
发现竟然有两个不同版本的jar包。。。
|三. 问题原因
为什么一个项目打出的 jar包里会有两个 asm 包呢?
1.项目哪些jar包依赖了asm包
使用 Maven 搜索 asm:

2. 为什么会有两个版本的asm包?
从Maven 官方网站里搜索 asm 包:

发现有两个 都叫 asm(但 不一样),点击第2个 asm,查看详情:

也就是说 为 asm 的包,从3.3.1版本后不再维护了,后续版本迁移到 为 org.ow2.asm 的 asm 包。
看到这里java could initialize,结论已经出来:
|四. 问题解决1. 该使用哪个版本的asm包?

到现在为止,已经在排查过程中也得到了有用的报错信息:
class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super class
翻译过来就是: 定义的是一个 ,但是现在却作为一个父类(super class)被其它类继承了
并且也理清了产生冲突的原因:项目jar包里包含两个asm包java could initialize,现在要确定项目使用哪个版本的asm包。
于是,从本机的 Maven 仓库里 分别找到 asm3.1 和 asm4.2 的包,并在 Idea 里打开.class:
asm3.1:

asm4.2:

可以看到:
2. 怎么解决冲突
由于asm 4.2是由 2.1.6 的依赖 cglib 3.1 引入的,因此降级 cglib 的版本,直接在pom.xml里引入低版本的 cglib 即可:
cglibgroupId> cglibartifactId> 2.2version>dependency>
更新依赖,再次使用Maven 查看:

可以看到:asm 版本已经降级成功。
使用 编译、打包、部署至测试环境后,再次测试项目的 excel 下载功能已经可以正常使用,jar包冲突导致的问题已经解决。

1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » #commons-pool2-2.3 jar包
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

