应用程序需要从运行时提供的jar加载类。在运行期间,这些jar应该被删除并被其他jar替换,这会失败,因为看起来,ClassLoader不会释放在jar上获取的文件句柄。
这是一个已知问题吗?是否有可用的类加载器没有这个问题?
编辑:用例不是关于加载同一个类的不同版本,而是加载同一个接口的不同实现。这些类使用应用程序必须调用的“execute”方法实现一个接口。因此,虽然类的卸载机制在这种情况下也很有用,但这不是主要的用例。
答案 0 :(得分:3)
它可以回答你的问题。使用UrlConnection并将cache设置为true时,它不会关闭文件处理程序。
此外,它还提供了将缓存设置为false的解决方法。
URL url = new URL("jar:file://dummy.jar!/");
URLConnection uConn = new URLConnection(url) {
@Override
public void connect() throws IOException {
// NOOP
}
};
uConn.setDefaultUseCaches(false);
在使用URLConnection之前,只需要在静态块中调用它。
这取决于您的类加载器的实现方式。
答案 1 :(得分:1)
在卸载类加载器之前,ClassLoader不会释放jar。如果不创建新的类加载器,则无法加载新版本的类,因此我看不出您希望如何工作。
也许您想要的是一个OSGi容器,例如Apache Karaf,它允许您在运行时加载/卸载库。