Gradle代理配置


161

我需要通过代理服务器从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 [ERROR] [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要求代理身份验证)响应,另一台始终以502错误的网关)响应,因此显然使用了proxyHost和proxyPort选项。

由于用户名(基于Active Directory用户)包含反斜杠,因此我尝试了\\\,但均不起作用。指定的用户不同于登录到计算机和Active Directory的用户。该用户的凭据对代理无效,因此我需要能够指定其他用户。

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


1
遇到相同的问题,这里的答案都没有帮助(即使是遵循不赞成/不赞成使用方法的答案)。然后我意识到必须设置https代理:stackoverflow.com/a/27686730/1024839
hkoosha

您应该查看以下完整,更新的网址(使用http和https):docs.gradle.org/current/userguide/…–
Guillaume

@GuillaumeHusta谢谢,但是请注意,这个问题是在5年前发布的,当时Gradle 0.8是最新版本,关于此的文档完全是错误的(请参阅我对这个问题的回答)。
Daniel Beck

我在代理使用引号时有此问题,使用systemProp.http.proxyHost = XYZ systemProp.http.proxyHost =“XYZ”
ir2pid

Answers:


211

对Daniel的回应进行细化:

HTTP Only代理配置

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在homedir或project dir中,构建仍然失败)。感谢您指出此问题的解决方法。请参阅参考文档,网址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)。


4
使用cntlm时帮我太
卢卡斯Siwiński

5
您如何删除代理?
乔纳森·

2
还-Dhttps.proxyUser =用户-Dhttps.proxyPassword = pass
Owen B

10
如果将属性放入,请~/.gradle/gradle.properties确保在属性systemPropsystemProp.http.proxyHost=127.0.0.1
前面

1
我尝试了这个,但对我没有用。为了使其工作,我不得不将选项(-Dhttp.proxyHost等)设置为JAVA_OPTS环境变量。
GoldenD

66

这是我的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

55

在我的电脑中,build.gradle我有以下任务,该任务使用常规的linux代理设置HTTP_PROXY以及HTTPS_PROXYshell 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

2
好有趣!是您的根目录的build.gradle还是应用程序的build.gradle?
Miao1007

1
同样适用于Windows 7!这应该是公认的答案!

1
谢谢!上面的方法适用于不需要代理密码的配置。我已经对其进行了修改,以使用或不使用代理密码,请参见下文
Norbert

if(map.keySet()中的键){
JustAnotherCoder

最佳答案。希望Java生态系统制定这样的开箱
Avindra Goolcharan

26

对我来说,可以将此配置添加到项目的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的代理是相同的


23

尝试以下方法:

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


2
考虑何时问这个问题。我在答案中链接的问题已标记为已解决Gradle 1.0-milestone-8…
Daniel Beck 2014年

2
@Daniel这个问题是突然出现的第一件事,当我搜索“等级代理”时,我略过了答案,那个是我需要的最清晰的答案……
Betlista

22

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

http.proxyUserhttp.proxyPassword似乎是不规范的,虽然流行,期权,因为他们没有在描述从摇篮教程链接Java参考页 ; 即使Gradle手册中提到了它们。

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


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


链接的区块对我来说仅是邀请。有此解决方法的公开示例吗?
Mike Yockey

@yock看到我提交给Gradle的问题的附件,它非常相似。
Daniel Beck

19

在c:\ Users \ your username \ .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 | >

5
@MurrayFoxcroft您在哪里看到该答案中的链接?
Max Vollmer

基本上是指向本地计算机的链接和文件转储。请更详细地描述答案。
Murray Foxcroft

superrrrrr tnx,您可能没有意识到您的帖子对我有多有用,但还是要非常感谢
Seyed Ali Roshan

@SeyedAliRoshan如何通过参数传递proxyUser和密码?我不想使用globle gradle.propaerties文件。
Nullpointer

@Nullpointer您是否尝试在项目的gradle中使用代理设置?
Seyed Ali Roshan

12

gradle.propertiesbuild.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,只需指定不带IP的IP http://https://
查看gradle官方文档以了解更多详细信息并在全局级别设置代理


9

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

在命令行中添加参数

(摘自纪尧姆·伯奇的帖子)

在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的协议部分...


1
我最初忽略的一个小而重要的细节:请注意,实际的主机名不包含http://URL的协议部分...
Joost

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

谢谢!以下是有关如何动态获取代理用户名和密码的最新信息
Norbert

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())
        }
    }
}

1

如果我尝试从android studio外观和行为=>系统设置=> HTTP代理设置代理。但是代理没有解决,所以我没有单击代理。

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

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


我已经将头发撕裂了一个小时,显然在Mac上,这些属性已自动添加到我的中~/.gradle/gradle.properties。感谢您指出。
EpicPandaForce

0

如果您落后于代理服务器并使用eclipse,请转到Window Menu --> Preferences --> General --> Network Connections。选择活动提供者为“手动”。

在“代理条目”部分下,单击“ HTTPS”,再单击“编辑”并添加代理主机和端口。如果需要用户名和密码,请同时输入。它为我工作!


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.