当前位置: 首页 > 面试题库 >

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

郭阳泽
2023-03-14
问题内容

这是一个普遍的问题。我正在使用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

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

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

非常感谢


问题答案:

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

了解有关类加载器层次结构的信息。

在您的设置中,棘手的部分是连接点,两个分支的类在这里汇合。两个分支都不能使用加载到另一个分支中的类。使其工作的方法是确保仅将引导类加载器(JRE类)或MY.jar的类加载器加载的类传递到两个分支。



 类似资料:
  • 我已经下载了TomEE plume 8.0.0-M2,TomEE plus 8.0.0-M2,TomEE webprofile 8.0.0-M2,TomEE microprofile 8.0.0-M2和OpenEJB Standalone 8.0.0-M2(来自http://tomee.apache.org/download-ng.html) 我已经安装了所有这些TomEE版本,并在解压缩后更改了

  • 问题内容: 当存在具有不同版本的重复JAR时,该行为非常不一致。有人知道JVM如何处理重复项吗? 问题答案: 类加载器按顺序搜索类路径,并使用找到的第一个匹配类。

  • 问题内容: 我已经安装了Java6和7,并使用eclipse编写了一个简单的jdbc应用程序。我在lib文件夹中同时有sqljdbc4.jar和sqljdbc.jar。我收到此消息… 2013年12月18日9:29:51 com.microsoft.sqlserver.jdbc.SQLServerConnection 严重:该驱动程序不支持Java Runtime Environment(JRE)

  • 问题内容: 如何在网络驱动程序中设置Firefox版本?我只想使用其他版本的Firefox。 就像其他版本19、20、21 … 请提供一个通用解决方案,该解决方案也对其他浏览器有所帮助。 问题答案: 您必须在系统上安装所有版本。然后,您可以使用System属性来定义Firefox的路径。请注意,由于路径是通过System属性设置的,因此您将无法在同一Java进程中运行两个不同的Firefox。 此

  • 1.背景 项目里已经引入了bcprov-jdk15on-1.54.jar,并且在很多地方使用. 现在合作方给过来一套新的接入资料,里面有以下jar包. 2.问题 项目中的bcprov-jdk15on存在两个版本,旧的是1.54,新的是1.69. 类似于下面这张图: 由于很多地方用到了1.54版本,所以不能直接升级到1.69. 现在想实现以下两点: 对于本次的新版本,其中的fintech-java-

  • 将以上内容更改为 解决了问题。但是,与其将Scala-XML2.11版本1.0.5排除在scalatest之外,我想强制scala编译器使用Scala-XML2.11版本1.0.5而不是版本1.0.4。(我在https://mvnrepository.com上研究了这些版本。)因此,我尝试将替换为 然而,这导致 [警告]*org.scala-lang:scala-library:(2.11.8,2