JAR 文件如何自我删除?
How Can a JAR File Delete Itself?
我需要一个 JAR 文件来删除自己。
问题是 Windows 在 运行ning 时锁定了 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 答案。
这是一个工作示例
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 Explorer
验证了我无法在执行时删除 jar 文件
我需要一个 JAR 文件来删除自己。
问题是 Windows 在 运行ning 时锁定了 JAR 文件,不能直接删除它自己。
我研究了批处理脚本可以终止 JAR 进程然后删除文件的解决方案,但是
System.exit(0)
不需要,因为它无法通过Batch
文件运行启用。taskkill /F /IM "java.exe"
不需要,因为它会杀死 ALLJava
个进程。jps
不能使用 because it is only available in theJDK
并且用户可能 运行 一个JRE
这样会失败。
我一直在寻找一个解决方案,让我使用 Java
代码找到当前 JAR
的 PID
,然后写出 Batch
命令并插入终止进程的 PID
,例如像下面这样:
printWriter.println("taskkill /PID " + currentJARPID);
如果您想知道这是做什么用的,可以查看 this 答案。
这是一个工作示例
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 Explorer