Java Classloader - 如何引用jar的不同版本

mic*_*son 19 java dependencies versions jar classloader

这是一个常见问题.我正在使用2个库A.jarB.jar,这些库依赖于同一个jar的不同版本.
假设在运行时我需要THIS.xxxjar

MY.jar   
     -> A.jar -> THIS.1.0.0.jar
     -> B.jar -> C.jar -> THIS.5.0.0.jar
Run Code Online (Sandbox Code Playgroud)

我可以针对它的依赖编译特定的jar(A.jar/B.jar)但是在运行时我只能加载1个版本.哪一个?
仅加载1个依赖项(最新版本)意味着如果库不是向后兼容的,那么我的代码可能会抛出运行时异常(那里有向后兼容的库吗?).

无论如何,我知道像OSGi这样的东西可以解决这个问题.
我想知道解决这类问题的旧方法是什么......

非常感谢

Vla*_*hev 7

你提到的"旧方法"(以及OSGI当然使用的一种方法)是为依赖关系的两个分支安装自己的ClassLoader.例如,应用程序服务器就能够在同一个JVM中运行相同应用程序的较旧版本和较新版本.

阅读类加载器层次结构.

在您的设置中,棘手的部分是关节点,两个分支的类在这里相遇.两个分支都不能使用加载到另一个分类中的类.使其工作的方法是确保只有引导类加载器(JRE类)或MY.jar的类加载器加载的类才传递给两个分支.