我有一个Java应用程序,我正在推动对捆绑的JRE的更新。这样做会让我重新启动应用程序,因为显然它在更换JRE时无法运行。我打开cmd并重命名旧文件夹,然后重命名新文件夹 - 这样,如果重命名失败,应用程序仍将启动旧版本。我没有足够的资源来建立一个更加完善的更新机制,而且我没有兴趣花时间为此开发一些东西。
我遇到了一个问题,但是从生成的cmd进程到java / lib / modules目录仍有一个打开的句柄。因此,它无法重命名,并且总是失败。
我无法弄清楚为什么这个句柄是开放的。我用来运行此更新脚本的代码是
public void runUpdateScript() {
String[] command = {"cmd.exe", "/c", "start", "cmd.exe", "/c", ModManager.getTempDir() + "updater.cmd"};
try {
ProcessBuilder pb = new ProcessBuilder(command);
pb.directory(new File(System.getProperty("user.dir")));
pb.start();
System.exit(0);
} catch (IOException e) {
// handler code goes here. Not necessary for this SO post
}
}
我的脚本等待了4秒,我检查的时间远远超过了java.exe的结束时间。但不知何故有这个打开的文件句柄,我无法弄清楚原因。