如何在Java主应用停止时自动终止后台Gradle进程?
解决Gradle后台进程随主进程自动终止的问题
问题核心在于你启动的gradlew.bat会创建独立的Gradle守护进程,且当前代码没有在主进程退出时主动终止这些关联进程。可以通过以下步骤修改代码:
修改方案
- 保留启动后的
Process实例引用,用于后续终止操作 - 给JVM注册关闭钩子,在主进程退出时触发进程销毁逻辑
- 优先尝试正常终止,超时未退出则强制销毁,确保进程被清理
修改后的代码:
Process gradleProcess = null; try { final var processBuilder = new ProcessBuilder("gradlew.bat", "compileGroovy", "--continuous") .directory(new File(System.getProperty("user.dir"))) .inheritIO(); gradleProcess = processBuilder.start(); // 注册JVM关闭钩子,主进程退出时自动终止Gradle相关进程 Runtime.getRuntime().addShutdownHook(new Thread(() -> { if (gradleProcess != null && gradleProcess.isAlive()) { // 先尝试正常终止进程 gradleProcess.destroy(); try { // 等待3秒,若进程仍未退出则强制销毁 if (!gradleProcess.waitFor(3, java.util.concurrent.TimeUnit.SECONDS)) { gradleProcess.destroyForcibly(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); gradleProcess.destroyForcibly(); } } })); } catch (IOException e) { // 不要忽略异常,打印日志便于排查问题 e.printStackTrace(); }
关键说明
- 关闭钩子:JVM在正常退出(如IntelliJ点击停止按钮、主程序执行完毕)时会执行钩子中的逻辑,保证关联进程被清理
- 进程销毁逻辑:
destroy()会向进程发送终止信号,destroyForcibly()则强制终止进程,配合waitFor给进程留足正常退出的时间 - 异常处理:移除了原代码中对
IOException的忽略,打印异常信息可以帮助定位启动失败的原因
内容的提问来源于stack exchange,提问作者kshep92
相关产品推荐
相关产品推荐

