应使用 --console=plain --no-daemon 组合禁用 Gradle 动态进度条:前者关闭 JLine 渲染器实现纯文本输出,后者避免守护进程干扰输出流;--quiet 仅调低日志级别,无法禁用 UI 层进度动画。

Gradle 在终端中默认启用动态进度条(如旋转符号、实时计数、多行刷新),这在 CI 日志归档、重定向输出或远程脚本中会导致乱码、日志截断或解析失败——直接关掉最稳妥。
用 --no-daemon 和 --console=plain 组合禁用所有动态渲染
Gradle 的动态进度由 console mode 控制,不是 daemon 或 log level 决定的。只加 --quiet 或 --info 无法关闭进度条;必须显式指定控制台模式:
-
--console=plain:强制使用纯文本输出,禁用所有 ANSI 转义、行内刷新、进度动画 - 顺带加上
--no-daemon:避免后台守护进程干扰输出流(尤其在 CI 中,daemon 可能缓存/延迟 flush 输出) - 二者组合是目前最可靠、跨 Gradle 版本(7.0+ 至 8.10)都生效的方式
示例命令:
./gradlew build --console=plain --no-daemon
为什么 --quiet 不行?
--quiet 只降低日志级别(隐藏 INFO 级别消息),但进度条属于 Gradle 自己的 UI 渲染层,独立于 logging system。它仍会输出 Downloaded 12/45 artifacts 这类动态行,并用 \r 覆盖前一行——导致日志里出现大量 ^M 或错位文本。
- 常见现象:Jenkins 构建日志里看到
[?25l[2K[1G[2K[1G> IDLE这类乱码,就是未禁用 console mode 的典型表现 -
--console=plain才真正关闭底层的JLine渲染器,让每条输出都是稳定换行的纯字符串
CI 环境中建议固化配置
在 GitHub Actions、GitLab CI 或 Jenkins pipeline 中,不要依赖环境变量自动降级,应显式写死参数:
- 避免只设
ORG_GRADLE_PROJECT_org_gradle_console=plain—— 这个系统属性在某些 Gradle 版本(如 7.5)下不生效 - Shell 脚本中统一用
./gradlew "$@" --console=plain --no-daemon封装调用 - 如果使用
gradle wrapper且无法改命令,可在项目根目录放gradle.properties,添加:org.gradle.console=plain(注意:仅对 wrapper 生效,且需 Gradle 6.8+)
真正要命的不是进度条本身,而是它和 stdout 缓冲、TTY 检测、CI 日志采集器之间的隐式耦合——一旦漏掉 --console=plain,日志就可能缺关键错误行,排查时反而更花时间。











