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

标签 java classloader

我已经做了很多搜索,但没有找到这个问题的答案。也许这无法完成,但这就是我所拥有的

  1. A.jar依赖于SomeLibrary-V2.jar
  2. A.jar 中的 Class1(间接)依赖于 SomeLibrary-V1.jar。

我想

  1. A.jar 从 V2 获取它的类
  2. Class1(及其触发加载的类)根据需要从 A.jar 中获取 V1 类或类。

我可以自己写child-first classloader在需要时按名称加载 Class1。然后这个类加载器将首先搜索 SomeLibrary-V1.jar(在父类加载器之前)。但是,不会将 Class1 的类加载器设置为我的类加载器,因为它将遵从父级。这意味着当 Class1 试图加载我想从 SomeLibrary-V1.jar 中加载的类时,我的子类加载器将不会被使用。

我想我需要将我的类加载器设置为 Class1 类的类加载器。我查看了将类加载器设置为我的类加载器实例的内省(introspection),但未公开 Class 对象的 classLoader 字段。另一种方法可能是从我的类加载器调用 definedClass() ,但我不能真正使用 parent 。

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

我希望我只是在这里遗漏了一些东西。感谢您的帮助。

最佳答案

欢迎来到JAR Hell !这不容易实现,因为类路径在 Java 中的工作方式非常简单。

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

希望这在未来会变得更好,当 Java 9 出现时,它将有一个标准的模块系统。

关于java - 需要用于不同类的两个版本的 jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626591/

相关文章:

Java 7 update 25 不允许在安装安全管理器的情况下进行类加载?

java - 如何从运行时类路径中读取目录?

java - 访问充当上限的通用集合的元素类型

java - 解析jsoup url android

java - 在 OSGi 框架中使用 Esper

java - DexClassLoader - 调用带参数的方法

java - 编译类加载器很有趣,在这种情况下,子类如何从不同的类加载器加载有什么想法吗?

java - 在不同的包中类 getResourceAsStream() 资源

java - idea intellij maven项目无法制作

java - 使用 onkeydown 方法或覆盖 onbackbuttonpressed 时,Android 后退按钮会卡住