1. 概述

代理服务器充当客户端和服务器之间的中介。它根据某些标准帮助评估来自客户端的请求,然后将它们转发到目标服务器。这使得系统能够灵活地决定连接哪个网络或不连接。

在这个教程中,我们将学习如何配置 Gradle 以在代理服务器后工作。例如,我们的代理服务器运行在本地主机上,HTTP和HTTPS连接的代理端口都是 3128

2. 代理配置

我们可以使用或不使用身份验证凭据来配置 Gradle 通过代理服务器工作。

2.1. 基本代理配置

首先,让我们在一个 Gradle 项目的根目录下创建一个名为 gradle.properties 的文件。

接下来,在 gradle.properties 文件中定义代理服务器的系统属性

systemProp.http.proxyHost=localhost
systemProp.http.proxyPort=3128
systemProp.https.proxyHost=localhost
systemProp.https.proxyPort=3128

在这里,我们定义了 Gradle 在构建过程中会使用的系统属性。我们为 HTTP 和 HTTPS 连接都定义了系统属性。在这种情况下,它们的主机名和代理端口相同。

此外,我们可以在 gradle.properties 文件中指定一个主机名来跳过代理服务器:

systemProp.http.nonProxyHosts=*.nonproxyrepos.com
systemProp.https.nonProxyHosts=*.nonproxyrepos.com

在上述配置中,子域名 nonproxyrepos.com 将绕过代理服务器,直接从服务器请求资源。

或者,我们可以通过终端运行 ./gradlew build 命令,通过终端传递系统属性:

$ ./gradlew -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 build

这里,我们在终端命令中定义了连接到代理服务器的系统属性。

值得注意的是,通过终端定义系统属性会覆盖 gradle.properties 文件的配置。

2.2. 添加身份验证凭据

如果代理服务器受保护,我们可以在 gradle.properties 文件中添加身份验证凭据:

systemProp.http.proxyUser=Baeldung
systemProp.http.proxyPassword=admin
systemProp.https.proxyUser=Baeldung
systemProp.https.proxyPassword=admin

在这里,我们通过定义用户名和密码的系统属性来添加身份验证凭据。同时,我们也为 HTTP 和 HTTPS 连接实施了身份验证。

另外,我们也可以在终端命令中指定用户名和密码:

$ ./gradlew -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -Dhttps.proxyUser=Baeldung -Dhttps.proxyPassword=admin build

在这里,我们在终端命令中包含了身份验证凭据。

3. 可能的错误

如果主机名和代理端口不正确,可能会出现错误:

> Could not get resource 'https://repo.maven.apache.org/maven2/io/micrometer/micrometer-core/1.12.0/micrometer-core-1.12.0.pom'.
> Could not GET 'https://repo.maven.apache.org/maven2/io/micrometer/micrometer-core/1.12.0/micrometer-core-1.12.0.pom'.
> localhosty: Name or service not known

这里,由于误写代理主机为“localhosty”而不是“localhost”,导致构建失败。

另外,如果在 gradle.properties 文件和命令行中都定义了系统属性,那么在构建过程中,命令行参数的定义具有最高优先级:

$ ./gradlew -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3120 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=3120 build

这里,命令行参数中的代理端口号是 3120,这是错误的。而 gradle.properties 文件中的代理端口号是正确的 3128。然而,由于命令行参数中的代理端口定义错误,构建失败并显示以下错误消息:

> Could not get resource 'https://repo.maven.apache.org/maven2/io/micrometer/micrometer-core/1.12.0/micrometer-core-1.12.0.pom'.
> Could not GET 'https://repo.maven.apache.org/maven2/io/micrometer/micrometer-core/1.12.0/micrometer-core-1.12.0.pom'.
> Connect to localhost:3120 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused

这里,代理服务器拒绝连接,因为尽管 gradle.properties 文件中的代理端口号正确,但命令行参数定义的值是错误的。命令行参数的定义优先于 gradle.properties 的值。

此外,如果在受保护的代理服务器上身份验证凭据错误,代理服务器也会拒绝连接。为了避免这些错误,必须正确检查配置。

4. 总结

在这篇文章中,我们了解了如何通过在 gradle.properties 文件中定义所需的系统属性来配置 Gradle 通过代理服务器工作。我们也看到了如何通过终端定义系统属性。最后,我们了解了一些容易犯的错误以及如何避免它们。

如往常一样,完整的示例代码可在 GitHub 上找到。