在运行时加载和卸载不同版本的jar

时间:2016-07-05 14:36:00

标签: java jar classloader

我正在使用某个库的两个不同版本。如果用户选择了一个对象,我将识别创建该对象的库版本。现在我需要运行与该版本相对应的代码。

问题是,两个库版本中的代码都是冗余的,每个版本仅对使用该版本创建的对象有效。我认为,结果是,我需要在运行时执行以下操作:

  • 卸载不需要的罐子
  • 装入所需的罐子。

使用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);

1 个答案:

答案 0 :(得分:0)

我认为你有两个选择:

  1. 使用jarjar(https://github.com/shevek/jarjar)重新打包一个版本的库,以便获得不同的包名称。这样,您可以同时在同一个ClassLoader中加载这两个版本。
  2. 创建2个ClassLoader,每个ClassLoaders加载一个库版本并编写大量委托和反射代码