【问题标题】:Gradle proxy configurationGradle 代理配置
【发布时间】:2011-08-24 20:58:17
【问题描述】:

我需要通过代理服务器从 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"
}

按照this 的描述,我在主目录的 .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 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 中设置相同的选项是可行的。

【问题讨论】:

  • 有同样的问题,这里的答案都没有帮助(即使是那些遵循弃用/非弃用方法的答案)。然后我意识到 https 代理 必须 设置:stackoverflow.com/a/27686730/1024839
  • 你应该看看这个网址,更完整和更新(带有http和https):docs.gradle.org/current/userguide/…
  • @GuillaumeHusta 谢谢,但请注意这个问题是在 5 多年前发布的,当时 Gradle 0.8 是最新版本,关于此的文档完全错误(请参阅我自己对这个问题的回答) .
  • 我在代理中使用引号时遇到了这个问题,使用 systemProp.http.proxyHost=x.y.z not systemProp.http.proxyHost='x.y.z'

标签: java proxy active-directory windows-server-2008 gradle


【解决方案1】:

细化丹尼尔的回应:

仅 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)。

【讨论】:

  • 在使用cntlm时也帮助了我
  • 你如何删除代理?
  • 还有 -Dhttps.proxyUser=user -Dhttps.proxyPassword=pass
  • 如果您将属性放入~/.gradle/gradle.properties,请确保在属性前加上systemProp,例如systemProp.http.proxyHost=127.0.0.1
  • 我试过这个,但对我不起作用。我必须将选项(-Dhttp.proxyHost 等)设置为JAVA_OPTS 环境变量才能使其工作。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在我的 build.gradle 中,我有以下任务,它使用来自 shell env 的常用 linux 代理设置 HTTP_PROXYHTTPS_PROXY

    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
    

    【讨论】:

    • 这很有趣!是你根的 build.gradle 还是 app 的 build.gradle?
    • 也适用于 Windows 7!这应该是公认的答案!
    • 谢谢!以上适用于不需要代理密码的配置。我已将其修改为使用或不使用代理密码,见下文
    • if (key in map.keySet()) {
    • 最佳答案。希望 java 生态系统能像这样开箱即用
    【解决方案4】:

    对我来说,可以在项目的 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的代理是一样的

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • @MurrayFoxcroft 你在哪里看到那个答案的链接?
      • 基本上是本地机器的链接和文件转储。请详细描述答案。
      • superrrrrr tnx,你可能没有意识到你的帖子对我有多么有用,但仍然非常感谢
      • @SeyedAliRoshan 我们如何通过参数传递代理用户和密码?我不想使用 globle gradle.propaerties 文件。
      • @Nullpointer 您是否尝试在项目的 gradle 中使用代理设置?
      【解决方案6】:

      尝试以下方法:

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

      【讨论】:

      • 在提出这个问题时考虑一下。我在回答中链接到的问题已标记为 Gradle 1.0-milestone-8…
      • @Daniel 这个问题是弹出来的第一件事,当我搜索“gradle proxy”时,我浏览了答案,那个是我需要的最清楚的答案......
      【解决方案7】:

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

      http.proxyUserhttp.proxyPassword 似乎是非标准选项,尽管很受欢迎,因为它们没有在 the Java reference page linked from the Gradle tutorial 中描述;即使 Gradle 手册中提到了它们。

      似乎 Java 程序希望支持代理身份验证 need to do this manually(我可以使用链接页面上的代码来做到这一点)。


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

      【讨论】:

      • 链接块仅供我邀请。是否有这种解决方法的公开示例?
      • @yock 见我提交给Gradle的issue的附件,很相似。
      【解决方案8】:

      在存在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 official doc 了解更多详情并在全局级别设置代理

      【讨论】:

        【解决方案9】:

        在代理后面使用 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 所说: 我最初忽略了一个小而重要的细节:注意实际主机名不包含 URL 的http:// 协议部分...

        【讨论】:

        • 我最初忽略的一个小而重要的细节:请注意,实际主机名不包含 URL 的 http:// 协议部分...
        【解决方案10】:

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

        【讨论】:

        • 谢谢!下面有关于如何动态获取代理用户名和密码的更新
        【解决方案11】:

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

        选中 NO PROXY 不会从 gradle.properties(全球)。您需要手动删除它。

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

        【讨论】:

        • 我已经把头发扯掉了一个小时,显然是在 Mac 上,这些属性已自动添加到我的 ~/.gradle/gradle.properties。感谢您指出。
        【解决方案12】:

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

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

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

        【讨论】:

          【解决方案13】:

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

          它对我有用。

          【讨论】:

            【解决方案14】:

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

            【讨论】:

              【解决方案15】:

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

              systemProp.http.nonProxyHosts=*.local, localhost
              

              【讨论】:

                【解决方案16】:

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

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

                【讨论】:

                  【解决方案17】:

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

                  【讨论】:

                    【解决方案18】:

                    如果您使用代理并使用 eclipse,请转到 Window Menu --&gt; Preferences --&gt; General --&gt; Network Connections。选择 Active Providers 作为“手动”。

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

                    【讨论】:

                      猜你喜欢
                      • 2016-09-09
                      • 2014-12-18
                      • 1970-01-01
                      • 2023-02-14
                      • 2016-08-10
                      • 2013-08-23
                      • 2020-07-28
                      • 2014-08-28
                      相关资源
                      最近更新 更多