【问题标题】:Gradle --no-daemon starts the daemon?Gradle --no-daemon 启动守护进程?
【发布时间】:2026-02-11 08:20:03
【问题描述】:

如何防止 gradle 与守护进程对话?

./gradlew --no-daemon -Porg.gradle.daemon=false -Dorg.gradle.daemon=false build -x test
Starting daemon
IDLE

我们在 ecs 上运行 jenkins 节点,所以守护进程似乎并没有给我们买太多东西。此外,我们在一个并行的 jenkins 管道块中运行了几个 gradle 执行,有时会看到守护进程错误——这是我没想到的:

[org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire exclusive lock on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
[org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
Daemon vm is shutting down... The daemon has exited normally or was terminated in response to a user interrupt.

似乎 gradle 需要守护进程才能使用它。我将尝试放弃并使用 gradle daemon 文档推荐的守护程序。

【问题讨论】:

  • 你有想过这个吗?有这个确切的问题。

标签: jenkins-pipeline gradle-daemon


【解决方案1】:

org.gradle.daemon=false 放入~/.gradle/gradle.properties 对我有用。

有一个警告,因为它仍然需要派生一个进程才能更改 JVM 设置。此进程实际上与常规守护进程相同,但对当前构建是私有的,并在之后终止。

为了遵守此构建的 JVM 设置,将分叉一个单一用途的守护进程。见https://docs.gradle.org/7.0/userguide/gradle_daemon.html#sec:disabling_the_daemon。 守护进程将在构建结束时停止

如果 JVM 设置已经匹配,则不会执行此操作。

请注意,虽然您获得了“效率较低”的构建,但您确实会在每次运行后修剪 gradle 缓存。否则它只会在共享守护进程退出时被修剪,这可能永远不会出现在 CI 系统中。

【讨论】:

    【解决方案2】:

    放弃并接受 --no-daemon 不太理想。使用守护进程运行,即使在基于 jenkins ECS 的单次使用节点上也能提高性能。对于通过管道并行块在同一节点上同时运行多个 gradle 执行的情况尤其如此。

    如果守护程序有问题,那么修复它比尝试禁用它更好。

    【讨论】:

    • 您是否有任何有用的提示可以分享您的经验?我目前正在与这些导致管道失败的守护进程死亡作斗争。
    • @vas 我建议您尽可能详细地提出问题。我们在 docker 容器内的 ECS 上运行的 jenkins 管道中使用守护进程。它对我们来说效果很好。我们还开始使用带有工件支持的构建缓存,以实现额外的编译避免和速度。 * 和 gradle 论坛受到 gradle 团队的密切监控,他们经常回复
    • 这没有帮助。
    • 我想不通。所以,祝大家好运。我曾希望 gradle 开发团队的人能回答这个问题。有 gradle 论坛可能是一个更好的地方来询问discuss.gradle.org
    最近更新 更多