首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载的JAR可以被Java进程删除吗?

加载的JAR可以被Java进程删除吗?
EN

Stack Overflow用户
提问于 2010-10-22 22:40:54
回答 3查看 3.3K关注 0票数 3

你好,我有以下问题:

在卸载过程中,我加载了一个JAR (jdbc-driver)。

代码语言:javascript
复制
    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就可以被删除。

有没有人知道如何删除这个文件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-22 22:48:24

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

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

另一种解决方案是编写加载Jar的类加载器。这样,当您想要摆脱它时,您可以确定Jar是关闭的。如果打开它的唯一对象是您的类加载器,那么您可以确定它是空闲的并且应该是可删除的。

票数 5
EN

Stack Overflow用户

发布于 2010-10-22 23:21:51

此问题已在Java7中修复;请在ClassLoader类中使用close()方法。对于较旧的版本,有几个选项:

sun.misc.URLClassPath中,

  • 编写一个自定义的类加载器,例如sun.misc.URLClassPath

反射,并关闭所有的JarFile实例

票数 2
EN

Stack Overflow用户

发布于 2019-05-21 16:29:58

因为我想杀死java11所需的类路径上的jar文件,但在Java1.8或更低版本中导致了问题;我使用的一种解决方案是将文件设为0字节,而不必启动另一个进程来杀死jar文件

代码语言:javascript
复制
FileOutputStream out = new FileOutputStream(f);
out.write(new byte[0]);
out.flush(); out.close();

下次应用程序启动此代码时,即使0字节文件仍在清单中,也会设法将其删除:

代码语言:javascript
复制
if (f.exists()){
    if (f.delete() == false) f.deleteOnExit();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3997902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档