Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAR文件如何删除自身?_Java_Windows_Batch File_Kill Process_Taskkill - Fatal编程技术网

Java 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命令并

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

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

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

  • 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
,它仍然可以正常工作,但删除速度更快