这是一个常见的问题。我使用了两个库A.jar和B.jar,它们依赖于同一个jar的不同版本。
假设在运行时我需要THIS.x.x.x.jar
MY.jar
-> A.jar -> THIS.1.0.0.jar
-> B.jar -> C.jar -> THIS.5.0.0.jar
我可以根据依赖项编译特定的jar (A.jar/B.jar),但在运行时我只需要加载一个版本。哪个?
只加载一个依赖项(最新版本)意味着,如果库不向后兼容(有向后兼容库吗?),我的代码可能会抛出运行时异常。
无论如何,我知道像OSGi这样的东西可以解决这个问题。
我想知道解决这类问题的旧方法是什么……
非常感谢
发布于 2009-10-12 15:18:11
您提到的“老方法”(也是OSGI肯定在幕后使用的方法)是为依赖项的两个分支安装自己的ClassLoader。例如,这就是应用程序服务器能够在同一JVM中运行同一应用程序的旧版本和新版本的原因。
阅读有关类加载器层次结构的内容。
在您的设置中,棘手的部分是连接点,即来自两个分支的类相遇的地方。两个分支都不能使用加载到另一个分支中的类。让它工作的方法是确保只有由引导类加载器(JRE类)或MY.jar的类加载器加载的类才会向下传递到两个分支。
发布于 2009-10-12 09:50:33
OSGi可以解决这个问题。OSGi捆绑包只不过是一个jar,其中包含详细说明版本的附加元数据。包有一个版本号,并将详细说明依赖jars的版本号(或范围)。
有关更多信息,请查看this introductory Javaworld article。
要在没有OSGi的情况下解决这个问题,就意味着必须手动确保您使用兼容的jars编译和运行。正如您已经发现的,这不一定是一项微不足道的任务。由于jars不一定标识它们的版本,因此唯一确定的方法是记录/比较校验和或签名。
发布于 2009-10-12 09:46:38
许多库是向后兼容的。但不是全部..
旧的方法是尝试只依赖于一个版本。
使用相同的版本(最新版本)编译这两个可能会更安全。
至少你得到的是编译时错误,而不是运行时错误。
如果需要,你可以对你的库进行一点修改,使之与旧的依赖关系一起工作……
这将需要访问源代码...
请注意,编译时兼容性也不能保证正确的运行时行为。这是一个步骤,然后您可以:
<代码>F29
https://stackoverflow.com/questions/1553567
复制相似问题