需求描述

现需要实现同时共存两个版本的 SDK,其中存在限定名完全相同的类,但两个类的方法并不完全相同,导致 JVM 在加载时无法按预期的调用类方法。

解决方案

由于 SDK 中依赖了大量的封装对象,无法使用简单的反射调用方法,因此自定义类加载器并不能解决。首先想到的是使用 maven 插件,在编译时修改指定的 SDK 的类名,maven-shade-plugin 并不能很好的解决,按照博客中的经验,可以将待处理的模块在一个空白模块中引入,并使用 shade 进行重命名,但是实际类引用的时候,依旧是原类名,只有在 maven 打包后,新名称将被替换值 class 文件中,这就导致了,如果有多个模块进行了调用 SDK,则需要处理多个模块,而且经常出现预期之外的问题,耗费精力。
最终是使用 jarjar 来解决的。
下载地址

1
java -jar jarjar.jar process rule.txt old.jar new.jar

其中,rule.txt 是任意文件名,其中指定了替换规则:

1
rule com.old.package.** com.new.package.@1

或者使用 jarjar-maven-plugin(未验证)

评论