1.背景
项目里已经引入了bcprov-jdk15on-1.54.jar
,并且在很多地方使用.
现在合作方给过来一套新的接入资料,里面有以下jar包.
bcprov-jdk15on-1.69.jar
fintech-java-sdk-core-3.1.0.jar
fintech-java-sdk-kdft-3.1.0.jar
2.问题
项目中的bcprov-jdk15on存在两个版本,旧的是1.54
,新的是1.69
.
类似于下面这张图:
由于很多地方用到了1.54
版本,所以不能直接升级到1.69
.
现在想实现以下两点:
- 对于本次的新版本,其中的fintech-java-sdk-core-3.1.0.jar、fintech-java-sdk-kdft-3.1.0.jar需要使用到bcprov-jdk15on-1.69.jar
- 对于以前的版本,bcprov-jdk15on-1.54.jar保持不动,还是使用这个版本.
即本次的升级不会影响到历史功能.
3.我的分析
如果不考虑冲突的情况,正常使用新jar,示例代码如下:
DefaultKdClient defaultKdClient = KdSdkConfig.getDefaultClient();
DemoApiInfo demoApiInfo = new DemoApiInfo();
Map<String, String> params = new HashMap<>();
DefaultKdRequest<Object> kdRequest = new DefaultKdRequest<>(demoApiInfo,
params);
我想过使用类加载器,可能是理解的还不到位,我觉得每个类都这样引入比较麻烦,比如DefaultKdClient
// custom class loader: CustomClassLoader
CustomClassLoader classLoader = new CustomClassLoader();
Class<?> defaultKdClient = classLoader.loadClass("xx.DefaultKdClient");
而且我不太确定这样能确保fintech-java-sdk-core-3.1.0.jar、fintech-java-sdk-kdft-3.1.0.jar中依赖的bcprov-jdk15on能是1.69版本.
除此之外,我也想过新建一个项目,这样就可以有不同的运行时,使得bcprov-jdk15on不再冲突,但是新项目需要新的维护成本,这种方式感觉也不太好.
4.问题
上面的场景,请问有什么比较好的解决方案,谢谢~
使用自定义类加载器能解决你的问题,例子。
这里给的例子只是一种最简单的解决方式,但是它肯定不适合你的情况,因为在你的代码中,调用一个 jar 肯定是直接通过类名调用的,而例子中给的只是反射。
因此需要你再针对 jar 的方法包装一下,比如你可以新建一个类
Bcprov_1_54
,加载bcprov-jdk15on-1.54.jar
,代理你用到的方法,然后再新建一个类Bcprov_1_69
,加载bcprov-jdk15on-1.69.jar
。这样你就拥有了两个版本的调用方式。