JAR 文件如何删除自身?

Bul*_*aza 2 java windows batch-file taskkill kill-process

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

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

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

  • System.exit(0)不需要,因为它不能通过Batch文件运行。
  • taskkill /F /IM "java.exe"不需要,因为它会杀死所有 Java进程。
  • jps不能使用,因为它只是在现有的JDK和用户可能运行一个JRE,这样会失败。

我一直在寻找一个解决方案,让我找到PID当前JAR使用的Java代码,然后写出一个Batch命令并插入PID杀死进程的 ,例如如下所示:

printWriter.println("taskkill /PID " + currentJARPID);
Run Code Online (Sandbox Code Playgroud)

如果你想知道这是做什么的,你可以查看这个答案。

phf*_*ack 6

这是一个工作示例

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

等待 5 秒后删除 jar 文件

为了测试,我曾经javac Delete.java && jar cfe Delete.jar Delete Delete.class构建过 jar,然后java -jar Delete.jar运行

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