以下是常见问题和解决建议的集合。您可以在 Gradle 论坛StackOverflow #gradle 答案中获取其他提示并搜索。

故障排除安装

如果您按照 安装说明 进行操作,但无法执行 Gradle 构建,这里有一些可能会有帮助的提示。

如果您在不调用 Gradle Wrapper 的情况下安装了 Gradle,则可以通过在终端中运行 gradle --version 来检查您的 Gradle 安装。

您应该看到类似以下内容

❯ gradle --version

------------------------------------------------------------
Gradle 6.5
------------------------------------------------------------

Build time:   2020-06-02 20:46:21 UTC
Revision:     a27f41e4ae5e8a41ab9b19f8dd6d86d7b384dad4

Kotlin:       1.3.72
Groovy:       2.5.11
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          14 (AdoptOpenJDK 14+36)
OS:           Mac OS X 10.15.2 x86_64

如果没有,这里有一些您可能会看到的内容。

找不到命令:gradle

如果您收到“找不到命令:gradle”,您必须确保 Gradle 已正确添加到您的 PATH 中。

JAVA_HOME 设置为无效目录

如果您收到类似以下错误

ERROR: JAVA_HOME is set to an invalid directory

将环境中的 JAVA_HOME 变量设置为与 Java 安装位置匹配

$ export JAVA_HOME=/Users/user/Library/Java/JavaVirtualMachines/corretto-11.0.22/Contents/Home
$ echo $JAVA_HOME
/Users/user/Library/Java/JavaVirtualMachines/corretto-11.0.22/Contents/Home

您必须确保已正确安装 Java 开发工具包 8 或更高版本,已设置 JAVA_HOME 环境变量,并且已将 Java 添加到您的 PATH 中。

权限被拒绝

如果您收到“权限被拒绝”,这意味着 Gradle 可能存在于正确的位置,但它不可执行。您可以在基于 *nix 的系统上使用 chmod +x path/to/executable 来修复此问题。

其他安装失败

如果 gradle—- version 可用,但所有构建都因相同的错误而失败,则可能是您的某个 Gradle 构建配置脚本已损坏。

您可以通过运行 gradle help 来验证 Gradle 脚本的问题,该命令执行配置脚本,但不执行 Gradle 任务。如果错误仍然存在,则意味着构建配置有问题。如果没有,则问题存在于执行一个或多个请求的任务时(Gradle 先执行配置脚本,然后执行构建步骤)。

调试依赖项解析

常见的依赖项解析问题(例如解决版本冲突)在 调试依赖项解析 中进行了介绍。

您可以查看依赖项树,并查看哪些已解析的依赖项版本与请求的版本不同,方法是单击依赖项视图并使用搜索功能,指定解析原因。

troubleshooting dependency management build scan
图 1. 使用构建扫描调试依赖项冲突

带有筛选条件的 实际构建扫描 可供探索。

调试缓慢的构建

对于构建性能问题(包括“同步时间慢”),请参阅 提高 Gradle 构建的性能

Android 开发人员应观看 Android SDK Tools 团队关于 加快 Android Gradle 构建速度 的演示。Android Studio 用户指南中还介绍了许多提示,内容是 优化构建速度

调试构建逻辑

将调试器附加到构建

您可以在 Gradle 构建本身中设置断点并调试 buildSrc 和独立插件,方法是将 org.gradle.debug 属性设置为“true”,然后将远程调试器附加到端口 5005。您可以通过将 org.gradle.debug.port 属性设置为所需端口号来更改端口号。

要通过网络远程附加调试器,您必须将 org.gradle.debug.host 属性设置为机器的 IP 地址或 *(侦听所有接口)。

❯ gradle help -Dorg.gradle.debug=true

使用 Kotlin DSL,您可以调试构建脚本本身。

以下视频演示了如何使用 IntelliJ IDEA 调试示例构建。

remote debug gradle
图 2. 构建脚本的交互式调试

添加和更改日志记录

除了 控制日志记录详细程度 之外,您还可以使用 --console=verbose 标志 在生命周期日志记录中控制任务结果(例如“UP-TO-DATE”)的显示。

您还可以通过注册各种事件侦听器来用您自己的日志记录替换 Gradle 的大部分日志记录。在 日志记录文档 中解释了一个 自定义事件记录器的示例。您还可以 控制外部工具的日志记录,使其更详细地调试其执行。

可以在 $GRADLE_USER_HOME/daemon/8.7/ 下找到 Gradle Daemon 的其他日志。

任务在应为 UP-TO-DATE 时执行

--info 日志解释了为什么执行任务,但构建扫描通过转到时间线视图并单击您要检查的任务,以可搜索的可视方式执行此操作。

troubleshooting task execution build scan
图 3. 使用构建扫描调试增量构建

您可以从 此列表 中了解任务结果的含义。

调试 IDE 集成

IDE 中的许多不常见错误可以通过“刷新”Gradle 来解决。另请参阅有关在 IntelliJ IDEAEclipse 中使用 Gradle 的更多文档。

刷新 IntelliJ IDEA

这仅适用于 链接到 IntelliJ 的 Gradle 项目。

从主菜单中,转到 视图 > 工具窗口 > Gradle。然后单击刷新图标。

troubleshooting refresh intellij
图 4. 在 IntelliJ IDEA 中刷新 Gradle 项目

刷新 Eclipse(使用 Buildship)

如果您正在为 Eclipse IDE 使用 Buildship,则可以通过打开“Gradle 任务”视图并单击“刷新”图标,或在编辑 Gradle 脚本时从上下文菜单中执行 Gradle > 刷新 Gradle 项目 命令来重新同步您的 Gradle 构建。

troubleshooting refresh eclipse
图 5. 在 Eclipse Buildship 中刷新 Gradle 项目

故障排除守护进程连接问题

如果您的 Gradle 构建在运行任何任务之前失败,您可能遇到了网络配置问题。当 Gradle 无法与 Gradle 守护进程通信时,构建将立即失败,并显示类似于此的消息

$ gradle help

Starting a Gradle Daemon, 1 stopped Daemon could not be reused, use --status for details

FAILURE: Build failed with an exception.

* What went wrong:
A new daemon was started but could not be connected to: pid=DaemonInfo{pid=55913, address=[7fb34c82-1907-4c32-afda-888c9b6e2279 port:42751, addresses:[/127.0.0.1]], state=Busy, ...

当使用网络地址转换 (NAT) 伪装时,可能会发生这种情况。启用 NAT 伪装后,应被视为本地计算机的连接会被屏蔽,以显示来自外部 IP 地址。作为安全预防措施,Gradle 拒绝连接到任何外部 IP 地址。

解决此问题的办法是调整网络配置,以便不会修改本地连接以显示为来自外部地址。

您可以在守护进程日志文件 ($GRADLE_USER_HOME/daemon/<Gradle version>/daemon-<PID>.out.log) 中监视检测到的网络设置和连接请求。

2021-08-12T12:01:50.755+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface enp0s3
2021-08-12T12:01:50.759+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
2021-08-12T12:01:50.769+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /fe80:0:0:0:85ba:3f3e:1b88:c0e1%enp0s3
2021-08-12T12:01:50.770+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /10.0.2.15
2021-08-12T12:01:50.770+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface lo
2021-08-12T12:01:50.771+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? true
2021-08-12T12:01:50.771+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding loopback address /0:0:0:0:0:0:0:1%lo
2021-08-12T12:01:50.771+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding loopback address /127.0.0.1
2021-08-12T12:01:50.775+0200 [DEBUG] [org.gradle.internal.remote.internal.inet.TcpIncomingConnector] Listening on [7fb34c82-1907-4c32-afda-888c9b6e2279 port:42751, addresses:[localhost/127.0.0.1]].
...
2021-08-12T12:01:50.797+0200 [INFO] [org.gradle.launcher.daemon.server.DaemonRegistryUpdater] Advertising the daemon address to the clients: [7fb34c82-1907-4c32-afda-888c9b6e2279 port:42751, addresses:[localhost/127.0.0.1]]
...
2021-08-12T12:01:50.923+0200 [ERROR] [org.gradle.internal.remote.internal.inet.TcpIncomingConnector] Cannot accept connection from remote address /10.0.2.15.

获取其他帮助

如果您在此处未找到解决问题的办法,请在 帮助论坛 上联系 Gradle 社区,或使用 help.gradle.org 搜索相关开发者资源。

如果您认为在 Gradle 中发现了错误,请在 GitHub 上 提交问题