Java 替换jar和重定向导入语句

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

我们有一个依赖于特定库的Java程序。我们已经创建了第二个库,它有一个与第一个库非常相似的API,但是,这个库是内部制作的,我们准备开始测试它

为了测试,我们想用新库的jar替换Java程序中的jar。问题是新库没有完全相同的命名空间,因此import语句不会对齐。比如说,

Java程序

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程序的源代码。我们可以将此程序更改为使用我们的新库,但我们不希望在它经过彻底测试之前这样做。

我能想到的唯一解决方案是编写一个自定义的
类加载器
,它将更改字节码以更改方法引用和字段引用以更改类名。

如何简单的解决方案是:

  • 创建主程序的分支(使用git或您使用的任何源代码管理工具):
  • 应用使用新库所需的所有更改(更改所有导入)
  • 在测试环境上部署并广泛测试
  • 当你有足够的自信时,合并回master
  • 另一个解决办法可以是:

  • 从新库中创建分支
  • 更改导入,使其看起来与旧导入完全相同(包括所有包)
  • 在应用程序中用新库替换旧库
  • 在测试环境上部署并广泛测试
  • 当您准备好使用新库时,请将其部署到生产环境中,并在生产环境中工作一个月或更长的时间(直到您真正感到自信为止)
  • 在一个月内更改所有导入(基本上从带有“旧”导入的分支移到带有库和应用程序中的实际导入的分支)
  • 更新

    anotherLibrary.x.y.Foo;
    
    如果使用maven,还可以自动重新定位库版本的包


    Maven shade插件具有可用于“重新定位”的
    重新定位
    目标您的库的包与现有库的包一样。请参见

    如果您创建了第二个库,并且只需要其中一个库,那么重命名您自己库的包以获得正确的包名不是更容易吗?编写一个程序/脚本,可以扫描所有文件并用新文件替换旧文件。因此解决方案1不起作用,因为我们无法访问Java程序的源代码。解决方案2可以工作,但我们希望避免这种情况。对不起,我没有意识到您无法访问应用程序的源代码。我已使用一个也适用于您的附加选项更新了答案。