我可以使用 ClassLoader 的 definePackage 从 jar 中覆盖一些包吗?
例如,应用程序当前包含来自 abc.jar 的“javax.xml.bind”。如果我调用 ClassLoader.definePackage(def.jar),其中 def.jar 包含另一个版本的 javax.xml.bind,我可以将整个应用程序的类路径替换为指向 def.jar 的类路径吗?谢谢。
我可以使用 ClassLoader 的 definePackage 从 jar 中覆盖一些包吗?
例如,应用程序当前包含来自 abc.jar 的“javax.xml.bind”。如果我调用 ClassLoader.definePackage(def.jar),其中 def.jar 包含另一个版本的 javax.xml.bind,我可以将整个应用程序的类路径替换为指向 def.jar 的类路径吗?谢谢。
不,您绝对不能用来ClassLoader.definePackage
从 jar 中“覆盖”某些包。
如果我理解正确,您想让您的 JVM 从 def.jar 加载 javax.xml.bind 下的任何类,而从 abc.jar 加载所有其他类。在这种情况下,您可以(按照我个人的偏好):
1) 将 def.jar 放在 CLASSPATH 中的 abc.jar 之前。这要求 def.jar 中不存在您要从 abc.jar 加载的类。
2) 解压缩 def.jar、abc.jar 或两者,并删除所有冲突的类,因此哪个 jar 在 CLASSPATH 中首先出现实际上是无关紧要的。然后重新压缩它们。或者你可以只在一个罐子上这样做,然后把它放在另一个罐子之前。
3)使用可配置的类加载器(对不起,我知道没有公共领域的加载器;如果你找到了,请告诉我)。对于操作系统项目来说,这可能是一个有趣的话题,除了一些具有相似(但更广泛)目标的计划已经在进行中,其中一些是语言的核心。
4) 为此目的创建一个类加载器,可能扩展默认的类加载器。