You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:13:13