Java JAR文件如何删除自身?
我需要一个JAR文件来删除它自己 问题是Windows在JAR文件运行时会锁定它,并且不能直接删除它自己 我已经研究了一些解决方案,其中批处理脚本可以杀死JAR进程,然后删除文件,但是Java JAR文件如何删除自身?,java,windows,batch-file,kill-process,taskkill,Java,Windows,Batch File,Kill Process,Taskkill,我需要一个JAR文件来删除它自己 问题是Windows在JAR文件运行时会锁定它,并且不能直接删除它自己 我已经研究了一些解决方案,其中批处理脚本可以杀死JAR进程,然后删除文件,但是 System.exit(0)是不需要的,因为它不能通过Batch文件运行 不需要taskkill/F/IM“java.exe”,因为它会杀死所有java进程 jps无法使用,用户可能会运行JRE,因此会失败 我一直在寻找一种解决方案,它可以让我使用Java代码找到当前JAR的PID,然后写出Batch命令并
是不需要的,因为它不能通过System.exit(0)
文件运行Batch
- 不需要
,因为它会杀死所有taskkill/F/IM“java.exe”
进程java
无法使用,用户可能会运行jps
,因此会失败JRE
我一直在寻找一种解决方案,它可以让我使用
Java
代码找到当前JAR
的PID
,然后写出Batch
命令并插入PID
,从而终止进程,例如如下所示:
printWriter.println("taskkill /PID " + currentJARPID);
如果您想知道这是干什么用的,您可以查看答案。下面是一个工作示例
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-n6>nul&&Delete.jar
之后,它会删除jar文件
为了测试,我使用javacdelete.java&&jarcfedelete.jardelete.class
来构建jar,并使用java-jardelete.jar
来运行
我还通过
newfile(“delete.jar”).delete()验证了在jar文件执行时无法删除该文件代码>并使用Windows资源管理器java文件是否可以读取bat文件输出,等待kill命令?或者您必须在不与java文件交互的情况下从bat文件中删除该文件?@phflack:我必须从批处理文件中删除java
进程,以便JAR
不再被锁定并可以删除。无法从Java
代码中执行删除操作,因为由于Windows
上的文件锁定,它无法同时运行和删除自身。我理解,我将重新表述这个问题:Java进程是否可以读取.bat输出相关?您考虑的进程是否确实可靠地工作?如果JVM关闭(释放可执行文件上的锁)的速度快于批处理文件的加载和执行速度,那么它可能会工作。我承认事情可能是这样的,但我不知道怎样才能保证。您是否可以从批处理文件启动JVM,然后让该批处理文件在JVM退出后删除JAR?还要注意.class文件没有Windows锁定问题,并使用新文件(“delete.class”)代码>工作您甚至可以使用-n2
,它仍然可以正常工作,但删除速度更快