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

如何在Java主应用停止时自动终止后台Gradle进程?

解决Gradle后台进程随主进程自动终止的问题

问题核心在于你启动的gradlew.bat会创建独立的Gradle守护进程,且当前代码没有在主进程退出时主动终止这些关联进程。可以通过以下步骤修改代码:

修改方案

  1. 保留启动后的Process实例引用,用于后续终止操作
  2. 给JVM注册关闭钩子,在主进程退出时触发进程销毁逻辑
  3. 优先尝试正常终止,超时未退出则强制销毁,确保进程被清理

修改后的代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:16:11