覆盖Java中的类

时间:2013-08-09 01:26:04

标签: java

我可以使用ClassLoader的definePackage覆盖jar内的一些包吗?

例如,应用程序当前包含abc.jar中的“javax.xml.bind”。如果我调用ClassLoader.definePackage(def.jar),其中def.jar包含另一个版本的javax.xml.bind,我可以将整个应用程序的类路径替换为指向def.jar的类路径吗?感谢。

1 个答案:

答案 0 :(得分:2)

不,你绝对可以使用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或两者,并删除任何冲突的类,这样在CLASSPATH中第一个jar首先是无关紧要的。然后重新拉链。或者你只能在一个罐子里把它放在另一个罐子里面。

3)使用可配置的类加载器(抱歉,没有我知道的公共域名;如果找到,请告诉我)。对于操作系统项目来说,这可能是一个有趣的话题,除了几个具有相似(但更广泛)目标的计划已经在进行中,其中一些是该语言的核心。

4)为此目的创建一个类加载器,可能会扩展默认的类加载器。