删除自身的Java程序 - 不工作

时间:2016-12-05 15:07:00

标签: java windows

我试图创建一个程序来创建自己的副本并删除原始项目文件夹。

(仅供参考:Project里面有自己的JRE) (仅供参考:此程序在Windows上运行)

所以:

为了能够做到这一点,除了我的主要主要方法之外,在类中有一个名为SelfUpdater的第二个主要方法。

在我的主线程中,我将项目复制到第二个文件夹。 然后在第二个项目文件夹中运行SelfUpdater的主要方法:

这应该意味着我正在运行一个全新的实例,与第一个java.exe完全无关(一旦新实例启动,它就已经用system.exit(0)关闭了)。

但是当我尝试删除第一个文件夹时,我收到错误"错误删除旧的client.java.io.IOException:无法删除文件"。 实际上删除了一些文件,但我无法删除Application.exe及其lib文件夹。

其文件夹未在Windows中打开。它没有被其他任何东西使用。我也无法手动删除该文件(Windows表示它正在使用中)。第二个java.exe一旦终止,我就可以删除它。

我无法提供一个完整的工作示例,但我在我的主线程中称之为以下方法:

public static void selfUpdate() {

    try {
        String separator = System.getProperty("file.separator");
        String classpath = System.getProperty("java.class.path");
        String rootPath = System.getProperty("user.dir");

        String path = null;

        File parentFolder = null;
        File originalClientFolder = new File(rootPath);
        parentFolder = originalClientFolder.getParentFile();

        File secondClientFolder = new File(parentFolder.getAbsolutePath() + separator + "runLAST");
        FileUtils.copyDirectory(originalClientFolder, secondClientFolder);

        path = secondClientFolder.getAbsolutePath() + separator + "jre8" + separator + "bin" + separator + "java";

        ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp", classpath, SelfUpdater.class.getName(), downloadURL, rootPath);            
        processBuilder.directory(secondClientFolder);
        processBuilder.start();

        System.exit(0);

    } catch (Exception ex) {

    }
}

我的SelfUpdater课程'主要是:

public static void main(String[] args) {
    try {                
        String originalClientFolderPath = args[1];
        //
        File oldClientFolder = new File(originalClientFolderPath);

        System.out.println("Deleting old client recursively. Folder: " + oldClientFolder.getAbsolutePath());
        try {
            FileUtils.deleteDirectory(oldClientFolder);
        } catch (Exception ex) {                
        }
    }
}

1 个答案:

答案 0 :(得分:1)

显然,我忘记更改类路径。

我正考虑离开这个问题,因为人们可能需要这样的代码部分。 但最后,被调用的方法改为:

public static void selfUpdate() {

    try {
        String separator = System.getProperty("file.separator");
        String classpath = System.getProperty("java.class.path");
        String rootPath = System.getProperty("user.dir");

        String path = null;

        File parentFolder = null;
        File originalClientFolder = new File(rootPath);
        parentFolder = originalClientFolder.getParentFile();

        File secondClientFolder = new File(parentFolder.getAbsolutePath() + separator + "runLAST");
        FileUtils.copyDirectory(originalClientFolder, secondClientFolder);

        // ADDED: --------------------------------------------------------
        String origialClientFolderName = originalClientFolder.getName();
        classpath = classpath.replace(origialClientFolderName, "runLAST");
        // ---------------------------------------------------------------

        path = secondClientFolder.getAbsolutePath() + separator + "jre8" + separator + "bin" + separator + "java";

        ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp", classpath, SelfUpdater.class.getName(), downloadURL, rootPath);            
        processBuilder.directory(secondClientFolder);
        processBuilder.start();

        System.exit(0);

    } catch (Exception ex) {

    }
}