以下是常见问题的集合以及解决这些问题的建议。您可以获取其他提示并搜索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

如果您收到“command not found: 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 添加到您的.JAVA_HOMEPATH

没有权限

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

其他安装失败

如果gradle—- version有效,但所有构建都失败并出现相同的错误,则可能是您的 Gradle 构建配置脚本之一已损坏。

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

调试依赖解析

依赖性解析故障排除中介绍了常见的依赖性解析问题,例如解决版本冲突。

您可以查看依赖关系树,并通过单击“依赖关系”视图并使用搜索功能来查看哪些已解析的依赖关系版本与请求的版本不同,并指定解决原因。

依赖管理构建扫描故障排除
图 1. 调试依赖项与构建扫描的冲突

解决构建缓慢的问题

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

Android 开发人员应该观看 Android SDK 工具团队关于加速 Android Gradle 构建的演示。 Android Studio 用户指南中还介绍了许多有关优化构建速度的技巧。

调试构建逻辑

将调试器附加到您的构建中

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

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

❯ gradle help -Dorg.gradle.debug=true

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

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

远程调试等级
图 2. 构建脚本的交互式调试

添加和更改日志记录

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

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

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

任务在应该是最新的时执行

--info日志解释了执行任务的原因,尽管构建扫描通过转到时间轴视图并单击要检查的任务以可搜索的可视方式执行此操作。

任务执行构建扫描故障排除
图 3. 使用构建扫描调试增量构建

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

调试 IDE 集成

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

刷新 IntelliJ IDEA

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

从主菜单转到View>> Tool WindowsGradle然后单击刷新图标。

刷新 intellij 故障排除
图 4. 在 IntelliJ IDEA 中刷新 Gradle 项目

刷新 Eclipse(使用 Buildship)

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

刷新 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 上提交问题。