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
代码找到当前JAR
的PID
,然后写出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 文件如何自行删除?的主要内容,如果未能解决你的问题,请参考以下文章