【发布时间】:2017-09-15 11:14:50
【问题描述】:
我正在尝试赋予我的应用自我更新能力。
它从我的网站下载一个 JAR 并将其保存为 myapp.jar.new。
之后,我想启动一个命令来删除当前版本并重命名新版本。
这是我的代码(见注释):
public void applyUpdateAndRestart() {
Runtime rt = Runtime.getRuntime();
rt.addShutdownHook(new Thread(() -> {
try {
String updateCmd = "restart.cmd";
try (PrintStream ps = new PrintStream(new FileOutputStream(updateCmd))) {
ps.println("@echo off");
// wait for a while to the main process closes and the "myapp.jar" to be writable
ps.println("ping 127.0.0.1 -n 2 > nul");
ps.println("del /q myapp.jar.old");
ps.println("move myapp.jar myapp.jar.old");
ps.println("move myapp.jar.new myapp.jar");
ps.println("java -jar myapp.jar");
}
ProcessBuilder p = new ProcessBuilder();
p.command("cmd", "/c", updateCmd);
System.out.println("Before apply update");
p.start(); // this does not launch
System.out.println("After apply update"); // this prints!
} catch (Throwable e) {
e.printStackTrace(); // this does not occurs!
}
}));
System.exit(0);
}
为什么我的update.cmd 没有启动?
【问题讨论】:
-
关闭线程抛出的任何异常都会被抑制,不会产生输出。我会捕获所有异常,而不仅仅是 IOExceptions,并打印结果 - 调用 cmd 时可能会出现问题。
-
@MarkusFischer 我也试过捕捉 Throwable,但它没有发生,抱歉,第二个 sysout 打印!
-
你看不到创建的子进程的输出,因为它的输出绑定到
p.start()返回的Process对象的InputStream。尝试使用ProcessBuilder.inheritIO()。
标签: java launch shutdown-hook