JAR 文件如何自行删除?

Posted

技术标签:

【中文标题】JAR 文件如何自行删除?【英文标题】:How Can a JAR File Delete Itself? 【发布时间】:2018-04-11 13:55:58 【问题描述】:

我需要一个 JAR 文件来删除自己。

问题是Windows在运行时会锁定JAR文件,不能直接删除自己。

我已经研究了批处理脚本可以杀死 JAR 进程然后删除文件的解决方案,但是

不需要System.exit(0),因为它不能通过Batch 文件运行。 taskkill /F /IM "java.exe" 是不需要的,因为它会杀死 ALL Java 进程。 jps 不能使用 because it is only available in the JDK,用户可能会运行 JRE,这样会失败。

我一直在寻找一种解决方案,让我使用Java 代码找到当前JARPID,然后写出Batch 命令并插入PID,这会杀死进程例如像下面这样:

printWriter.println("taskkill /PID " + currentJARPID);

如果您想知道这是做什么用的,可以查看this 的答案。

【问题讨论】:

java文件能否读取bat文件输出,等待kill命令?还是必须在不与 java 文件交互的情况下从 bat 文件中终止文件? @phflack:我必须从批处理文件中杀死Java 进程,以便JAR 不再被锁定并且可以被删除。无法从Java 代码中删除,因为由于Windows 上的文件锁定,它无法同时运行和删除自身。 我明白了,我把问题改写一下:java进程能否读取.bat输出 也相关How can a Java program get its own process ID? 您正在考虑的过程是否真正可靠地工作?如果 JVM 关闭——可执行文件上的锁被释放——比加载和执行批处理文件的速度更快,它可能会起作用。我承认事情可能会以这种方式进行,但我不知道如何保证。您能否不从批处理文件启动 JVM,然后让该批处理文件在 JVM 退出后删除 JAR? 【参考方案1】:

这是一个工作示例

public class Delete

    public static void main(String[] args) throws Throwable
    
        System.out.println("Running");

        System.out.println("Deleting");
        Runtime.getRuntime().exec("cmd /c ping localhost -n 6 > nul && del Delete.jar");

        System.out.println("Ending");
        System.exit(0);
    

为此提供动力的主要功能是cmd /c ping localhost -n 6 > nul && del Delete.jar

删除waiting 5 seconds之后的jar文件

为了测试,我使用javac Delete.java && jar cfe Delete.jar Delete Delete.class 构建jar,并使用java -jar Delete.jar 运行

我还通过new File("Delete.jar").delete(); 和 Windows 资源管理器验证了我无法在 jar 文件执行时删除它

【讨论】:

另请注意,.class 文件没有 Windows 锁定问题,并且使用 new File("Delete.class"); 有效 您甚至可以使用-n 2,它仍然可以正常工作,但删除速度更快

以上是关于JAR 文件如何自行删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ubuntu中删除/卸载自行安装的字体

如何删除zip或者jar压缩包中的文件

nexus3.14 如何把远程上的jar包删除

Gradle 重复输入错误:META-INF/MANIFEST.MF(或如何从 jar 中删除文件)

Android Studio删除依赖

镜像文件怎么删除?