191

我需要通过代理服务器从 Gradle 访问 Web,才能使用 Jenkins 的 Gradle/Artifactory 集成。为了减少问题的可能原因,我在 build.gradle 中手动添加 Artifactory 插件并从命令行运行它:

apply {
    apply from: "http://gradle.artifactoryonline.com/gradle/plugins/org/jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryplugin-1.0.1.gradle"
}

按照这个描述,我在主目录的 .gradle/gradle.properties 中指定了以下内容:

systemProp.http.proxyHost=hostname
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=de\\username
systemProp.http.proxyPassword=xxx

使用上述代理配置(以其他方式已知可以工作),它会失败:

11:33:17.699 [错误] [org.gradle.BuildExceptionReporter] 原因:java.io.IOException:服务器返回 HTTP 响应代码:407 用于 URL:http ://gradle.artifactoryonline.com/gradle/plugins/org/ jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryplugin-1.0.1.gradle

我有两台代理服务器可供选择,一台总是以407( Proxy authentication required ) 响应,另一台以502( Bad gateway ) 响应,因此显然使用了 proxyHost 和 proxyPort 选项。

由于用户名(基于 Active Directory 用户)包含反斜杠,因此我尝试了\\and \,但都没有成功。指定的用户与登录到机器和 Active Directory 的用户不同。此用户的凭据对代理无效,因此我需要能够指定其他用户。

在 Jenkins 或 Artifactory 的 GUI 中设置相同的选项是可行的。

4

18 回答 18

238

完善丹尼尔的回应:

仅 HTTP 代理配置

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

仅 HTTPS 代理配置

gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

HTTP 和 HTTPS 代理配置

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

使用用户和密码的代理配置

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 - Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 -Dhttps.proxyUser=user -Dhttps.proxyPassword=pass -Dhttp.proxyUser=user -Dhttp.proxyPassword=pass -Dhttp.nonProxyHosts=host1.com|host2.com

为我工作(gradle.properties在主目录或项目目录中,构建仍然失败)。感谢您指出提供此解决方法的 gradle 问题。请参阅https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy上的参考文档

更新 您还可以将这些属性放入gradle-wrapper.properties(请参阅:https ://stackoverflow.com/a/50492027/474034 )。

于 2014-03-26T16:01:13.983 回答
82

这是我的 gradle.properties,请注意那些 HTTPS 部分

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8118
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8118
于 2016-05-06T18:54:02.670 回答
64

在我的build.gradle我有以下任务,它使用通常的 linux 代理设置,HTTP_PROXY并且HTTPS_PROXY来自 shell env:

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            def url = e.value.toURL()
            println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
        }
    }
}

build.dependsOn setHttpProxyFromEnv
于 2015-11-10T18:06:47.293 回答
31

对我来说,可以在项目的 gradle.properties 文件中添加此配置,其中 build.gradle 文件是:

systemProp.http.proxyHost=proxyURL
systemProp.http.proxyPort=proxyPort
systemProp.http.proxyUser=USER
systemProp.http.proxyPassword=PASSWORD
systemProp.https.proxyHost=proxyUrl 
systemProp.https.proxyPort=proxyPort
systemProp.https.proxyUser=USER
systemProp.https.proxyPassword=PASSWORD

其中:proxyUrl 是代理服务器的 url ( http://.... )

proxyPort 是端口(通常是 8080)

USER 是我的域用户

密码,我的密码

在这种情况下,http 和 https 的代理是相同的

于 2016-09-08T13:57:09.830 回答
29

查看 c:\Users\您的用户名\.gradle\gradle.properties:

systemProp.http.proxyHost=<proxy host>
systemProp.http.proxyPort=<proxy port>
systemProp.http.proxyUser=<proxy user>
systemProp.http.proxyPassword=<proxy password>
systemProp.http.nonProxyHosts=<csv of exceptions>
systemProp.https.proxyHost=<proxy host>
systemProp.https.proxyPort=<proxy port>
systemProp.https.proxyUser=<proxy user>
systemProp.https.proxyPassword=<proxy password>
systemProp.https.nonProxyHosts=<csv of exceptions seperated by | >
于 2018-09-03T14:17:36.353 回答
24

尝试以下操作:

gradle -Dhttp.proxyHost=yourProxy -Dhttp.proxyPort=yourPort -Dhttp.proxyUser=usernameProxy -Dhttp.proxyPassword=yourPassoword

于 2014-12-15T18:49:35.493 回答
24

使用一个非常简单的“请求 URL”Java 程序,我能够复制该问题。

http.proxyUser并且http.proxyPassword似乎是非标准的,尽管很受欢迎的选项,因为它们没有在Gradle 教程链接的 Java 参考页面中描述;即使 Gradle 手册中提到了它们。

似乎希望支持代理身份验证的 Java 程序需要手动执行此操作(我可以使用链接页面上的代码执行此操作)。


我将此问题(和修复)提交给 Gradle 问题跟踪器。提出的问题 GRADLE-1556 已在 1.0-milestone-8(2012 年 2 月)中解决

于 2011-05-13T13:57:36.213 回答
13

gradle.properties在文件所在的项目文件夹中创建一个名为的build.gradle文件。添加以下条目

     systemProp.http.proxyHost=proxy_url
     systemProp.http.proxyPort=proxy_port
     systemProp.http.proxyUser=USER
     systemProp.http.proxyPassword=PWD
     systemProp.https.proxyHost=proxy_url 
     systemProp.https.proxyPort=proxy_port
     systemProp.https.proxyUser=USER
     systemProp.https.proxyPassword=PWD

如果您使用 DNS 作为代理,请添加它systemProp.https.proxyHost=www.proxysite.com

对于 IP,只需指定不带 out 的 IPhttp://https://
查看gradle 官方文档以获取更多详细信息并在全局级别设置代理

于 2017-11-08T11:19:15.997 回答
10

在代理后面使用 Gradle 有两种方法:

在命令行中添加参数

(来自 Guillaume Berche 的帖子)

在您的 gradle 命令中添加这些参数:

-Dhttp.proxyHost=your_proxy_http_host -Dhttp.proxyPort=your_proxy_http_port

或者如果您使用的是 https ,则使用这些参数:

-Dhttps.proxyHost=your_proxy_https_host -Dhttps.proxyPort=your_proxy_https_port

在 gradle 配置文件中添加行

gradle.properties 添加以下几行:

systemProp.http.proxyHost=your_proxy_http_host
systemProp.http.proxyPort=your_proxy_http_port
systemProp.https.proxyHost=your_proxy_https_host
systemProp.https.proxyPort=your_proxy_https_port

gradle.properties文件位置请参考官方文档https://docs.gradle.org/current/userguide/build_environment.html


编辑:正如@Joost 所说:我最初忽略的一个小但重要的细节:注意实际的主机名不包含 http://URL 的协议部分......

于 2018-02-02T12:00:32.733 回答
5

基于 SourceSimian 的回复;这适用于 Windows 域用户帐户。请注意,用户名 包含域,

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            def url = e.value.toURL()
            println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
            System.setProperty("${base}.proxyUser", "Username")
            System.setProperty("${base}.proxyPassword", "Password")
        }
    }
}
build.dependsOn setHttpProxyFromEnv
于 2017-12-28T19:03:11.413 回答
2

如果我尝试从 android studio Appearance & Behavior => System Settings => HTTP Proxy 设置代理。但是代理没有成功,所以我点击没有代理。

选中NO PROXY不会从 gradle.properties(Global) 中删除代理设置。您需要手动删除它。

所以我删除了所有以systemProp开头的属性,例如 - systemProp.http.nonProxyHosts=*.local, localhost

于 2018-05-15T13:03:41.020 回答
1

编辑您的~/.gradle/gradle.properties文件,然后添加以下内容:

org.gradle.jvmargs=-DsocksProxyHost\=127.0.0.1 -DsocksProxyPort\=1080 -DhttpProxyHost\=127.0.0.1 -DhttpProxyPort\=1081 -DhttpsProxyHost\=127.0.0.1 -DhttpsProxyPort\=1081
  • DsocksProxyHost是 socks5 代理主机
  • DhttpProxyHost是http代理主机
  • DhttpsProxyHost是 https 代理主机

它对我有用。

于 2021-08-03T03:09:37.407 回答
1

@sourcesimian@kunal-b 的答案的更新,如果在系统属性中配置,则动态设置用户名和密码。

以下设置用户名和密码(如果提供)或仅添加主机和端口(如果未设置用户名和密码)。

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            //Get proxyHost,port, username, and password from http system properties 
            // in the format http://username:password@proxyhost:proxyport
            def (val1,val2) = e.value.tokenize( '@' )
            def (val3,val4) = val1.tokenize( '//' )
            def(userName, password) = val4.tokenize(':')
            def url = e.value.toURL()
            //println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
            System.setProperty("${base}.proxyUser", userName.toString())
            System.setProperty("${base}.proxyPassword", password.toString())
        }
    }
}
于 2018-03-26T18:14:56.147 回答
0

在 kotlin .kts 设置文件中,属性应该这样定义:

extra["systemProp.http.proxyHost"]="127.0.0.1"
extra["systemProp.http.proxyPort"]="12345"
于 2021-08-20T06:04:02.110 回答
0

如果 HTTP 错误 407 的问题仅发生在选定的包上,则问题不在于代理设置和 Internet 连接。您甚至可以通过 NAT 将您的 PC 暴露在互联网上,但仍然会面临这个问题。通常同时您可以在浏览器中下载所需的包。我找到的唯一解决方案:删除您个人资料中的 .gradle 文件夹(不在项目中)。同步项目后,需要很长时间,但会恢复所有内容。

于 2017-11-03T12:51:27.397 回答
0

我在安装旧版本的 SDK 并设置后遇到了同样的问题,JAVA_HOME上面.zshrc的解决方案都没有帮助我,但最后RESTARTED COMPUTER(Mac)然后错误消失了。

于 2021-08-23T16:09:02.197 回答
0

如果您使用的是颤振,请添加以下行android/gradle.properties

systemProp.http.nonProxyHosts=*.local, localhost
于 2021-05-23T18:47:40.997 回答
-1

如果您在代理后面并使用 eclipse,请转到Window Menu --> Preferences --> General --> Network Connections. 选择活动提供者作为“手动”。

在代理条目部分下,单击 HTTPS,单击编辑并添加代理主机和端口。如果需要用户名和密码,请同时提供。它对我有用!

于 2015-08-13T09:57:05.827 回答