#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

大概意思是:

java could initialize

定义的是一个 ,但是现在却作为一个父类(super class)被其它类继承了。

这种情况表明java could initialize,此时应该存在jar包冲突了:

4. 从刚刚解压的项目jar包里查找asm包

由于这个报错信息里包含asm,所以尝试查找包含asm的jar包:

发现竟然有两个不同版本的jar包。。。

|三. 问题原因

为什么一个项目打出的 jar包里会有两个 asm 包呢?

1.项目哪些jar包依赖了asm包

使用 Maven 搜索 asm:

java could initialize

2. 为什么会有两个版本的asm包?

从Maven 官方网站里搜索 asm 包:

java could initialize

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

java could initialize

也就是说 为 asm 的包,从3.3.1版本后不再维护了,后续版本迁移到 为 org.ow2.asm 的 asm 包。

看到这里java could initialize,结论已经出来:

|四. 问题解决1. 该使用哪个版本的asm包?

java could initialize

到现在为止,已经在排查过程中也得到了有用的报错信息:

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:

java could initialize

asm4.2:

java could initialize

可以看到:

2. 怎么解决冲突

由于asm 4.2是由 2.1.6 的依赖 cglib 3.1 引入的,因此降级 cglib 的版本,直接在pom.xml里引入低版本的 cglib 即可:

    cglibgroupId>    cglibartifactId>    2.2version>dependency>

更新依赖,再次使用Maven 查看:

java could initialize

可以看到:asm 版本已经降级成功。

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

java could initialize

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

资源库 - 资源分享下载网 » #commons-pool2-2.3 jar包

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们