Java 替换jar和重定向导入语句
我们有一个依赖于特定库的Java程序。我们已经创建了第二个库,它有一个与第一个库非常相似的API,但是,这个库是内部制作的,我们准备开始测试它 为了测试,我们想用新库的jar替换Java程序中的jar。问题是新库没有完全相同的命名空间,因此import语句不会对齐。比如说, Java程序Java 替换jar和重定向导入语句,java,api,jar,classloader,Java,Api,Jar,Classloader,我们有一个依赖于特定库的Java程序。我们已经创建了第二个库,它有一个与第一个库非常相似的API,但是,这个库是内部制作的,我们准备开始测试它 为了测试,我们想用新库的jar替换Java程序中的jar。问题是新库没有完全相同的命名空间,因此import语句不会对齐。比如说, Java程序 import someLibrary.x.y.Foo; public class Main { public static void main(String[] args){ new
import someLibrary.x.y.Foo;
public class Main {
public static void main(String[] args){
new Foo().bar();
}
}
新库具有相同的API但命名空间不同
anotherLibrary.x.y.Foo;
问题:如何使用classloader或其他工具运行Java程序,但替换依赖项并将导入语句重定向到其他命名空间
[编辑]-我们无法访问Java程序的源代码。我们可以将此程序更改为使用我们的新库,但我们不希望在它经过彻底测试之前这样做。我能想到的唯一解决方案是编写一个自定义的
类加载器
,它将更改字节码以更改方法引用和字段引用以更改类名。如何简单的解决方案是:
anotherLibrary.x.y.Foo;
如果使用maven,还可以自动重新定位库版本的包
Maven shade插件具有可用于“重新定位”的
重新定位
目标您的库的包与现有库的包一样。请参见如果您创建了第二个库,并且只需要其中一个库,那么重命名您自己库的包以获得正确的包名不是更容易吗?编写一个程序/脚本,可以扫描所有文件并用新文件替换旧文件。因此解决方案1不起作用,因为我们无法访问Java程序的源代码。解决方案2可以工作,但我们希望避免这种情况。对不起,我没有意识到您无法访问应用程序的源代码。我已使用一个也适用于您的附加选项更新了答案。