Gradle代理配置

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

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中指定了以下内容。在我的主目录中的属性:

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

使用上面的代理配置(否则已知工作),它会失败:

11:33:17.699[错误][org.gradle.]导致:java.io.IOException:服务器返回HTTP响应代码:407 for 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中设置相同的选项也可以。

416183 次浏览

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

http.proxyUserhttp.proxyPassword似乎是非标准的选项,尽管很流行,因为它们没有在Java参考页面链接自Gradle教程中描述;尽管Gradle手册提到了它们。

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


我向Gradle问题跟踪器提交了这个问题(和一个修复)。提出的问题GRADLE-1556在1.0-milestone-8中得到解决(2012年2月)

细化丹尼尔的回答:

HTTP Only Proxy配置

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

仅代理配置

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或项目目录,构建仍然失败)。感谢您指出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)

试试下面的方法:

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

如果你不支持代理并使用eclipse,请转到Window Menu --> Preferences --> General --> Network Connections。选择Active Providers为“Manual”。

在代理条目部分,单击HTTPS,单击编辑并添加代理主机&端口。如果需要用户名和密码,也要提供。这对我很管用!

在我的build.gradle中,我有以下任务,它使用通常的linux代理设置,HTTP_PROXYHTTPS_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

这是我的gradle。属性,请注意那些HTTPS部分

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8118
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8118

对我来说,在gradle中添加这个配置是可行的。项目的属性文件,其中。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
< p >地点: proxyUrl是代理服务器的url (http://..。.)

proxyPort是端口(通常是8080)

USER是我的域用户

密码,我的密码

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

如果HTTP错误407的问题只发生在选定的包上,那么问题不在于代理设置和internet连接。您甚至可以通过NAT将您的PC暴露在互联网上,仍然会面临这个问题。通常,您可以同时在浏览器中下载所需的软件包。 我发现唯一的解决办法是:删除配置文件中的.gradle文件夹(不是在项目中)。之后同步项目,这将花费很长时间,但恢复一切

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

     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只指定没有http://https://的IP
检查Gradle官方文档以获得更多详细信息,并在全局级别设置代理

基于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

有两种方法在代理后使用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 < p >

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所说: 我一开始忽略了一个小而重要的细节:注意URL的实际主机名中不包含的 http://协议部分…

更新@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())
}
}
}

在我的情况下,我试图设置代理从android工作室外观&行为=>系统设置=> HTTP代理。但代理没有工作,所以我点击没有代理。

检查没有代理将不会从 gradle.properties(全球)。

.使用实例

所以我删除了所有以systemProp开头的属性,例如- systemProp.http.nonProxyHosts = *。本地主机

退房 c:\Users\your用户名\ .gradle \ gradle.properties: < / p >

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 | >

如果您正在使用flutter,请在android/gradle.properties中添加以下行

systemProp.http.nonProxyHosts=*.local, localhost

编辑你的~/.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代理主机

这对我很管用。

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

extra["systemProp.http.proxyHost"]="127.0.0.1"
extra["systemProp.http.proxyPort"]="12345"

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