记一次奇妙的jar包冲突

先上主角

在这里插入图片描述

在这里插入图片描述
首先,如果有两个对象路径和名称完全一样,加载的时候是会出问题的。这个很好理解,毕竟如果都是三方包,理论上都是使用同一个类加载器加载的,加载器找到了多个看起来一模一样的类,于是迷茫了,但是我今天的问题不属于这个,虽然两个包里面有路径完全一样的两个类,但是我并没有加载,我加载的是两个类名不一样的且并无重复的对象,抛出了如下异常

java.lang.SecurityException: class “XXXXXXXX”'s signer information does not match signer information of other classes in the same package

时间紧任务重,没时间研究代码,于是开始面向百度编程:

第一轮
搜索:“java.lang.SecurityException: class “XXXXXXXX”'s signer information does not match signer information of other classes in the same package”
答案一:这个一般都是有相同的jar不同版本同时存在导致的,删掉低版本就好了(好吧,面向菜鸟回答,pass)
答案二:xxxx培训欢迎你,年薪百万不是梦(hei,tui~)
答案三:论如何在同一个项目里使用不同版本的同一个jar包,然后给了一个类加载器工作原理图,没了。。。(不过倒是开拓了思路)

第二轮
搜索:“如何在同一个项目里面使用相同的jar包不同版本”
答案一:不可能的哟~(你们老板真是好人)
答案二:目前做不到的哟~(???)
答案三:论如何在同一个项目里使用不同版本的同一个jar包,然后给了一个类加载器工作原理图,没了。。。(怎么感觉好像在哪里看到过?)

一轮搜索下来,脑阔都大了一圈,还是得自己撸代码(看来九点准时下班只能是一个梦想了),然后直接定位到异常抛出的地方在这里插入图片描述
这里大概就是在加载某个类之前,会先把他的路径取出来,看看之前有没有加载过这个路径下面的对象,有的话,就把两个路径对应的证书拿出来对比一下(这个貌似是在MATE-INF目录下的,待补充),很明显我上面的问题就是路径一致但是证书不一样,所以挂了。那问题就有思路了。
1:最直接的办法就是改路径(也是我采用的办法)
1):首先找到这个jar包,反编译出来
2):然后新建一个maven项目,取个好听好记的名字,把刚才反编译的项目下面java文件直接复制到我们新建项目的main目录下
3):按需要改包名(要注意是否有全类名引用,反射等邪道用法,避免改完以后项目挂掉了)
4):打包并把包送到远程仓库
5):排除项目原有依赖,引用新依赖,然后记得加注释,加注释,加注释
在这里插入图片描述
2:绝对路径解决一切冲突(凑数的,操作起来太复杂了)
3:类加载器感觉有一点可行性,但是以目前我对类加载器的认知来看,这个东西分任务也是按照路径来的,想要把这两个包的加载任务分给不同的加载器,想想感觉都很麻烦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值