找回密码
 立即注册
首页 业界区 安全 java中对于使用不兼容的不同版本的同一个第三方包的处理 ...

java中对于使用不兼容的不同版本的同一个第三方包的处理办法

押疙 2025-5-31 23:35:18
1. 起因

最近项目中需要接入一个第三方系统,该系统提供了接入sdk,并使用了“bcprov-jdk16-1.46.jar”这个加密库,但在接入之前,我们使用了hutool里的加密模块的sm2加密,并依赖了“bcprov-jdk18on-1.78.jar”,由于这两个版本不兼容,就导致了两边只能有一个可以调通,在网上找了好多的文章,因为两个都是引入的第三方包,所以好多方法都不适用,几经波折最后终于解决,遂记录一下。
2. 解决办法

为方便说明,我们将依赖关系简述如下:
第三方系统的接入sdk: a.jar 依赖了第三方加密包 b.jar的1.0.0版本,
自己加密算法使用了第三方工具: c.jar 依赖了第三方加密包 b.jar的2.0.0版本, 并与1.0.0版本不兼容;
这个方法需要能获取到a.jar 或者 c.jar的源码,两者其实可以互换
2.1 将c.jar的源码下载下来

在我的案例是下载hutool的源码
2.2 将c.jar中自己使用的模块的源码集成到自己的代码中

将hutool的加密模块和core模块复制到项目里
2.2 通过jarjar更改包名(b.jar的2.0.0版本 更改为 d.jar)

2.2.1 下载jarjar

jarjar下载地址: https://mvnrepository.com/artifact/com.googlecode.jarjar/jarjar
里面的两个包都下载下来,有可能1.1不行,但是1.3可以,也可能反过来
2.2.2 下载需要的包(b.jar的2.0.0版本)

尽量在上面的maven仓库下载,国内的镜像仓库可能更新不及时,在我的案例中阿里仓库的好几个版本都不行,最后在上面的仓库里找到了15to18的1.80版本(阿里的仓库里没有这个版本)才可以改包名
2.2.3 更改包名

2.2.3.1 运行java -jar jarjar.jar strings b_2.0.0.jar

如果出现类似下面的内容,则可以更改包名
1.png

如果报错或者出现下面的内容则不能更改,换个版本的b.jar再试
2.png

2.2.3.2 创建rule.txt

里面的内容是要替换的包名规则
rule cn.b.** com.d.@1
其中 cn.b 是需要替换的内容, com.d是替换后的内容
2.2.3.2 运行java -jar jarjar.jar process rule.txt b.jar d.jar

其中b.jar是原来的jar包名称,d.jar是更改后的jar包名称,如果没有报错,那么包名就已经改好了
更详细的用法可以参考文章https://www.cnblogs.com/yejiurui/p/4283505.html
2.4 在maven中导入改名后的本地jar包(d.jar)
  1.        <dependency>
  2.             <groupId>cn.com</groupId>
  3.             d</artifactId>
  4.             <version>1.0.0</version>
  5.             <scope>system</scope>
  6.             <systemPath>${project.basedir}/lib/d.jar</systemPath>
  7.         </dependency>
复制代码
2.5 将c.jar源码中使用到b.jar包中的引用更改为改名后的本地包(d.jar)

2.6 测试运行,解决问题


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册