2010-10-22 184 views
3

您好,我有以下问题:Java进程可以删除加载的JAR吗?

在卸载过程中,我加载了一个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复制到该临时文件。但是现在Tempfile不会被删除。

我读过,如果ClassLoad是GC,加载的罐子可以被删除。

有没有人有想法,如何删除此文件?

回答

5

这取决于操作系统。 Windows不会让你删除正在使用的文件,但Linux会。

一个解决方案是启动第二个进程,等待您的JVM死掉然后删除文件,因为即使您清除对使用它的类加载器的所有引用,也不保证它们将释放该文件。没有办法强制对象的垃圾收集(甚至是最终化)。

另一种解决方案是编写加载Jar的类加载器。那样,当你想摆脱它时,你可以确定罐子是封闭的。如果打开它的唯一对象是你的类加载器,那么你可以肯定它是免费的,应该是可删除的。

2

此问题已在Java 7中修复;使用ClassLoader类中的close()方法。对于旧版本,有几种选择:

  • 编写自定义类加载器,例如, like this

  • 使用反射并关闭所有JarFile实例;他们居住在sun.misc.URLClassPath

相关问题