首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Classloader -如何引用不同版本的jar

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

Stack Overflow用户
提问于 2009-10-12 09:28:22
回答 5查看 10.4K关注 0票数 19

这是一个常见的问题。我使用了两个库A.jarB.jar,它们依赖于同一个jar的不同版本。

假设在运行时我需要THIS.x.x.x.jar

代码语言:javascript
复制
MY.jar   
     -> A.jar -> THIS.1.0.0.jar
     -> B.jar -> C.jar -> THIS.5.0.0.jar

我可以根据依赖项编译特定的jar (A.jar/B.jar),但在运行时我只需要加载一个版本。哪个?

只加载一个依赖项(最新版本)意味着,如果库不向后兼容(有向后兼容库吗?),我的代码可能会抛出运行时异常。

无论如何,我知道像OSGi这样的东西可以解决这个问题。

我想知道解决这类问题的旧方法是什么……

非常感谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-12 15:18:11

您提到的“老方法”(也是OSGI肯定在幕后使用的方法)是为依赖项的两个分支安装自己的ClassLoader。例如,这就是应用程序服务器能够在同一JVM中运行同一应用程序的旧版本和新版本的原因。

阅读有关类加载器层次结构的内容。

在您的设置中,棘手的部分是连接点,即来自两个分支的类相遇的地方。两个分支都不能使用加载到另一个分支中的类。让它工作的方法是确保只有由引导类加载器(JRE类)或MY.jar的类加载器加载的类才会向下传递到两个分支。

票数 7
EN

Stack Overflow用户

发布于 2009-10-12 09:50:33

OSGi可以解决这个问题。OSGi捆绑包只不过是一个jar,其中包含详细说明版本的附加元数据。包有一个版本号,并将详细说明依赖jars的版本号(或范围)。

有关更多信息,请查看this introductory Javaworld article

要在没有OSGi的情况下解决这个问题,就意味着必须手动确保您使用兼容的jars编译和运行。正如您已经发现的,这不一定是一项微不足道的任务。由于jars不一定标识它们的版本,因此唯一确定的方法是记录/比较校验和或签名。

票数 4
EN

Stack Overflow用户

发布于 2009-10-12 09:46:38

许多库是向后兼容的。但不是全部..

旧的方法是尝试只依赖于一个版本。

使用相同的版本(最新版本)编译这两个可能会更安全。

至少你得到的是编译时错误,而不是运行时错误。

如果需要,你可以对你的库进行一点修改,使之与旧的依赖关系一起工作……

这将需要访问源代码...

请注意,编译时兼容性也不能保证正确的运行时行为。这是一个步骤,然后您可以:

  • 读取WhatsNew文件中的新版本jar
  • 在互联网上查找用户报告的兼容性问题
  • 编写JUnits
  • 比较两个jar中的代码

<代码>F29

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1553567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档