我可以动态卸载和重新加载(相同版本的其他版本)JAR吗?

2022-09-02 21:55:45

我正在编写一个服务器程序,用于运行API的单元测试(显示大量信息并提供Web访问以控制/监视整个事情)...

此 API 在编译时已知,并作为 JAR 提供。

为了能够比较不同版本的API的单元测试结果(无需重新启动服务器),我希望能够卸载API的“当前”版本,并重新加载较新的版本(或较旧的版本)。

我不想使用URLClassLoader并按名称
调用每个方法(使用getDeclaredMethod(“someMethod”)),
因为服务器严重依赖API,并且以这种肮脏的方式“包装”每个方法调用会很复杂。

我在想:由于所有版本的JAR的所有接口都是相同的,难道我不能通过以某种方式重新加载另一个版本的JAR来做到这一点(没有那个按名称调用?)。

注意:我使用的是最新的 Java SE (6) 和 Java EE (5)。

如果您认为,我试图实现的目标是不可能的,请建议一个“解决方法”或其他概念。


答案 1

我认为如果你加载一个类使用

Class.forName(clsname, init, classloader); 

(Javadoc 在这里),您将获得给定类装入器提供的类的实例。由于该类而加载的所有内容也将通过相同的类加载器加载。

只要您非常小心从现在开始实例化的对象(以允许GC),您应该能够重新加载不同的版本。我以前在Java 1.3中做过一次,它需要大量的调试,但是最后我有一个“引导”应用程序,它按名称加载一个类,并且能够通过针对不同的URL实例化新的类加载器来“软重启” 然后再次运行。Runnable


答案 2

你可以使用开源包:JclLoader,它有助于加载同一jar的不同版本。这也是我们的一个系统进行测试的需要。

友情链接: http://sourceforge.net/projects/jcloader/


推荐