私は自分のアプリの自己更新機能を提供しようとしています。 私のウェブサイトから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
が起動しないのはなぜ?
シャットダウンスレッドによってスローされた例外はすべて抑止され、出力は作成されません。私はIOExceptionだけでなく、すべての例外をキャッチし、結果を表示します。おそらく、cmdを呼び出すときに何かが間違っている可能性があります。 –
@ MarkusFischer Throwableもキャッチしようとしましたが、発生しません。残念ですが、2番目のsysoutが印刷されます! –
出力は 'p.start()'によって返された 'Process'オブジェクトの' InputStream'に束縛されているので、作成された子プロセスの出力は表示されません。 'ProcessBuilder.inheritIO()'を使ってみてください。 –