我需要通过代理服务器从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中设置相同的选项也可以。


当前回答

基于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中添加这个配置是可行的。项目的属性文件,其中。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的代理是相同的

更新@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 =*。本地主机

编辑~/.gradle/gradle。属性文件,然后添加以下内容:

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代理主机

这对我很管用。

试试下面的方法:

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