我试图创建一个程序来创建自己的副本并删除原始项目文件夹。
(仅供参考: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) {
}
}
}
答案 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) {
}
}