我有一个自我更新的Java应用程序。此应用程序下载它的新版本,使用ProcessBuilder
类在下载后启动新版本,并告诉JVM在JVM退出后删除旧版本。发布的代码如下:
ProcessBuilder pb = null;
if (deleteOldVersion) {
try {
String path = UpdateChecker.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");
log.getLogger().info("The following file will be deleted, once the JVM exits: " + decodedPath);
(new File(decodedPath)).deleteOnExit();
} catch (UnsupportedEncodingException e) {
log.getLogger().log(Level.SEVERE, "An error occurred", e);
}
}
log.getLogger().info("Launching new version using command: java -jar " + destFolder + File.separator + destFilename);
pb = new ProcessBuilder("java", "-jar", destFolder + File.separator + destFilename).inheritIO();
pb.start();
System.exit(0);
新进程应该按原样启动,并且它继承标准输出,但是当我退出新版本的应用程序时,命令行永远不会将进程显示为已完成:
没有剩下的线程正在运行,出于某种奇怪的原因,我无法在eclipse中或正常启动新版本时重现该行为。
这里出了什么问题?我知道遗漏.inheritIO()
会有所帮助,但我真的想在新版本中使用相同的标准。