我想給我的應用程序的自我更新能力。 它從我的網站下載JAR並保存爲myapp.jar.new
。的Java關閉掛鉤不會推出我的過程
在那之後,我想推出一個命令刪除當前版本並重新命名新的。
這是我的代碼(見註釋):
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()'。 –