JDK21.0.2用JPackage打包后,启动第三方进程退出时被连带关闭问题咨询
问题原因分析
这个回归问题源于JDK 21.0.2对jpackage生成的Windows平台启动器的进程组管理逻辑做了变更:
- 在JDK 21.0.1及更早版本中,
jpackage生成的exe启动器不会将通过Runtime.exec()启动的子进程(包括这里的cmd.exe及其衍生的notepad++.exe)纳入自身的进程组。当Java进程调用System.exit(0)退出时,仅会终止自身,子进程不受影响,可继续运行。 - 从JDK 21.0.2开始,
jpackage的Windows启动器默认将所有子进程绑定到同一个进程组中。当Java进程退出时,启动器会终止整个进程组内的所有进程,这就导致你的Java程序退出时,连带关闭了cmd.exe和目标第三方程序。
另外,直接运行java -jar时不会触发此问题,是因为这种启动方式未经过jpackage生成的平台专属启动器,不存在进程组绑定的逻辑。
临时解决思路
如果需要保留原有行为,可以修改子进程的启动方式,让第三方程序脱离当前进程组:
- 使用
cmd.exe的start命令启动第三方程序,修改后的命令数组如下:
String[] cmdToRunUsingArgs = {"cmd.exe", "/C", "start", "", "C:\\Program Files\\Notepad++\\notepad++.exe"};
这里的空字符串是start命令的窗口标题参数,必须保留(否则会把目标程序路径当成标题导致启动失败)。通过start命令启动的程序会成为独立进程,不再属于原Java进程的进程组,Java程序退出时就不会影响它。
内容的提问来源于stack exchange,提问作者sblantipodi
相关产品推荐
相关产品推荐

