你好,我有以下问题:
在卸载过程中,我加载了一个JAR (jdbc-driver)。
URL pDriverJar = jarToDelete.toURI().toURL();
URL[] lURLList = new URL[]{pDriverJar};
URLClassLoader lLoader = new URLClassLoader(lURLList, Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(lLoader);
Class<?> aClass = Class.forName("jdbc.Driver"); // was Oracle: oracle.jdbc.OracleDriver but should not be important
if(jarToDelete.delete()){
System.out.println("deleted");
}else {
jarToDelete.deleteOnExit();
}在终止JVM之后,jar仍然存在。
作为一种变通办法,我创建了一个临时文件,并将Jar复制到该临时文件中。但是现在临时文件将不会被删除。
我读到过,如果ClassLoad是GC,那么加载的jars就可以被删除。
有没有人知道如何删除这个文件?
发布于 2010-10-22 22:48:24
这取决于操作系统。Windows不允许您删除正在使用的文件,但Linux会。
一种解决方案是启动第二个进程,等待JVM终止,然后删除该文件,因为即使您清除了对使用它的类加载器的所有引用,也不能保证它们会释放该文件。没有办法强制对对象进行垃圾收集(甚至是终结化)。
另一种解决方案是编写加载Jar的类加载器。这样,当您想要摆脱它时,您可以确定Jar是关闭的。如果打开它的唯一对象是您的类加载器,那么您可以确定它是空闲的并且应该是可删除的。
发布于 2010-10-22 23:21:51
此问题已在Java7中修复;请在ClassLoader类中使用close()方法。对于较旧的版本,有几个选项:
在sun.misc.URLClassPath中,
sun.misc.URLClassPath反射,并关闭所有的JarFile实例
发布于 2019-05-21 16:29:58
因为我想杀死java11所需的类路径上的jar文件,但在Java1.8或更低版本中导致了问题;我使用的一种解决方案是将文件设为0字节,而不必启动另一个进程来杀死jar文件
FileOutputStream out = new FileOutputStream(f);
out.write(new byte[0]);
out.flush(); out.close();下次应用程序启动此代码时,即使0字节文件仍在清单中,也会设法将其删除:
if (f.exists()){
if (f.delete() == false) f.deleteOnExit();
}https://stackoverflow.com/questions/3997902
复制相似问题