【发布时间】:2016-07-05 22:52:21
【问题描述】:
我正在使用某个库的两个不同版本。如果用户选择一个对象,我将识别创建该对象的库版本。现在我需要运行与该版本对应的代码。
问题是,这两个库版本中的代码都是多余的,每个版本只对使用该版本创建的对象有效。我认为,结果是,我需要在运行时执行以下操作:
- 卸载不需要的罐子
- 加载所需的罐子。
这可以通过使用 URLClassLoader 实现吗?好像是这样的?
File dirVersion3= new File("lib/dirVersion3");
File dirVersion4= new File("lib/dirVersion4");
URL[] url={dirVersion4.toURL()};
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader loader = new URLClassLoader(url, currentThreadClassLoader);
Thread.currentThread().setContextClassLoader(loader);
【问题讨论】:
-
这是一个独立的 Java 类还是部署在应用服务器上的实用程序的一部分?
-
基本上,如果您为每个库创建一个新的类加载器,您可以同时拥有两个版本。如果您使用两个不同(对等)类加载器加载同一个类,您会注意到 CL1 加载的
ClassA与 CL2 加载的ClassA不同,因为 CL 是加载的类对象的一部分!您可以做的是将公共代码重构为两个 JAR 版本都在使用的库,使用公共 CL 或应用程序 CL 加载公共 JAR,并将此 CL 用作特定于版本的 CL 的父级。
标签: java jar classloader