はじめに
jdk-21.0.2+13 で行われた変更により、シャットダウン・フックが動かなくなった原因の継続調査。
以下の続きになります。
MCVE
MCVE にして調査を進めよう。
App.java
public class App { public static void main(String[] args) { System.out.println("java.vm.version: " + System.getProperty("java.vm.version")); Runtime.getRuntime().addShutdownHook(new Thread("My Shutdown Hook") { public void run() { System.out.println("ShutdownHook started"); try { Thread.sleep(3000); } catch (Exception e) { } System.out.println("ShutdownHook finished"); } }); while (true) { try { Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } System.out.print("."); } } }
jar に固めて実行する。
javac .\App.java jar -cvfe libs\app.jar App *.class java -jar libs\app.jar
この時の Java が jdk-21.0.1+12 でも jdk-21.0.8+9 でも、ShutdownHook finished が表示され、シャットダウンフックは正しく処理されるようだ。
となると jpackage 側の問題か?
MCVE jpackage
app.jar を jpackage でアプリケーションイメージを作成する。
jpackage --type app-image --win-console --name app --input libs --main-jar app.jar
この時の Java が jdk-21.0.1+12 の場合、ShutdownHook finished が表示される。
この時の Java が jdk-21.0.8+9 の場合、ShutdownHook finished は表示されない。
jpackage に問題が潜んでいるようだ。
こいつか、犯人は
改めてリリースノートを見ると、
8301247: JPackage app-image exe launches multiple exe's in JDK 17+
こいつか、犯人は
プロセスの起動方法を Executor から起動するように変更しているようだ。
以下で報告しておいた。