需要两个版本的jar文件用于不同的类

时间:2016-04-14 14:45:11

标签: java classloader

我做了很多搜索,但没有找到这个问题的答案。也许这不可能做到,但这就是我所拥有的

  1. A.jar取决于SomeLibrary-V2.jar
  2. A.jar中的Class1(间接)依赖于SomeLibrary-V1.jar。
  3. 我想要

    1. A.jar从V2获取课程
    2. Class1(及其触发加载的类),以便在必要时从A.jar获取V1类或类。
    3. 我可以编写自己的child-first classloader以在需要时按名称加载Class1。然后,此类加载器将首先搜索SomeLibrary-V1.jar(在父类加载器之前)。但是,Class1的类加载器不会设置为我的类加载器,因为它将遵循父类。这意味着当Class1尝试加载我想要来自SomeLibrary-V1.jar的类时,不会使用我的子类加载器。

      我想我需要将我的类加载器设置为Class1类的类加载器。我已经研究了将类加载器设置为我的类加载器实例的内省,但是没有公开Class对象的classLoader字段。另一种方法可能是从我的类加载器调用definedClass(),但后来我无法真正使用父类。

      我见过this,但答案是建议编写一个类加载器,但没有提供任何细节。我在这里提供了一些细节,提出了解决方案的其他问题/问题(我希望 - 我没有代表添加评论)。

      我希望我在这里遗漏一些东西。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

欢迎来到JAR Hell!这是不可能的,因为类路径在Java中的工作方式过于简单。

有解决方案,但没有简单,快速的解决方案。您可以使用已经发现的各种类加载器技巧,或者使用OSGi之类的模块系统。

希望将来会有更好的,当Java 9问世时,它会有一个标准的模块系统。

答案 1 :(得分:0)

虽然解决方案是可能的,但任何此类解决方案都将是一个非常脆弱的解决方案,几乎可以肯定会导致更多的问题。我会说,如果它完全可以避免依赖同一个lib的不同版本。可以看一下这样一个事实:你有这样的依赖关系作为问题的症状,并尝试解决根本原因。