我试图创build一个程序来创build自己的副本,并删除原来的项目文件夹。
(仅供参考:项目内有自己的JRE)(仅供参考:此程序在Windows上运行)
所以:
为了能够做到这一点,除了我的主要的主要方法之外,在类SelfUpdater中还有第二个主要的方法。
在我的主线程中,我将项目复制到第二个文件夹。 然后在第二个项目文件夹中运行SelfUpdater的主要方法:
这应该意味着我正在运行一个全新的实例,与第一个java.exe完全无关(一旦新实例启动,它已经被system.exit(0)closures了)。
但是当我尝试删除第一个文件夹时,出现错误“删除旧的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) { } } }
显然,我忘了更改类路径。
我正在考虑离开这个问题,因为人们可能需要这样的代码部分。 但最后,被调用的方法改为:
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) { } }