【问题标题】:How to configure a proxy server for both HTTP and HTTPS in Maven's settings.xml?如何在 Maven 的 settings.xml 中为 HTTP 和 HTTPS 配置代理服务器?
【发布时间】:2015-09-10 23:41:35
【问题描述】:

我在代理服务器后面使用 Maven 3.1.1。同一个代理处理HTTPHTTPS 流量。

我似乎无法告诉使用settings.xml 的maven 使用这两种协议。在我看来,只能有一个活动代理,因为首先定义的活动代理都会被使用,而随后的“活动”代理定义将被忽略。这是我的settings.xml

<proxies>
    <proxy>
        <id>myhttpproxy</id>
        <active>true</active>
        <protocol>http</protocol>
        <host>192.168.1.2</host>
        <port>3128</port>
        <nonProxyHosts>localhost</nonProxyHosts>
    </proxy>
    <proxy>
        <id>myhttpsproxy</id>
        <active>true</active>
        <protocol>https</protocol>
        <host>192.168.1.2</host>
        <port>3128</port>
        <nonProxyHosts>localhost</nonProxyHosts>
    </proxy>
</proxies>

是否可以在maven的settings.xml中同时为HTTPHTTPS配置代理?我知道我可以通过将 Java 系统属性传递给 maven 调用来解决此问题,例如:

-Dhttps.proxyHost=192.168.1.2 -Dhttps.proxyPort=3128

但这肯定可以在settings.xml内部实现?

MNG-2305MNG-4394 等 Maven 错误表明此问题已解决,但我不相信。

或者,是否有一个我可以在本地运行的“代理代理”,我可以将 maven 指向? “代理代理”将相应地路由 http/https。即便如此,我仍然需要在 settings.xml 中定义两个活动代理定义,以便 Maven 引导这两种类型的流量。

【问题讨论】:

    标签: java maven http https proxy


    【解决方案1】:

    settings.xml 中的 Maven 代理同时用于 http 和 https,所以你只需要定义一个代理服务器,它将同时用于两者,你只需要留下一个 proxy 标签,像这样:

    <proxies>
        <proxy>
            <id>myhttpproxy</id>
            <active>true</active>
            <protocol>http</protocol>
            <host>192.168.1.2</host>
            <port>3128</port>
            <nonProxyHosts>localhost</nonProxyHosts>
        </proxy>
    </proxies>
    

    上面的协议是代理服务器的协议,不是被代理的请求。

    【讨论】:

    • 非常有用的信息,可惜你没有得到更多的赞誉。 +1,为我工作。
    • @krzyk maven's settings documentation 似乎同意你的观点:protocol, host, port:代理的协议://host:port,分成离散的元素。我将尝试重新测试 - 现在已经有一段时间了......!
    • 我知道这看起来像协议是指代理的协议,但对我来说,它不适用于仅一个代理。当我添加了两个代理时,就像 OP 建议的那样,然后对我来说它起作用了(使用 Maven 3.3.9)。起初它不起作用,因为我在 settings.xml 中复制/粘贴了代理服务器,我忘记为第二个代理服务器设置不同的 id。在我输入不同的 id 后,它起作用了。
    • @StephenHartley 你有机会测试一下吗?
    • 不起作用。您需要代理条目,一个用于 HTTP,一个用于 HTTPS,您必须使用 ID 标签,具有不同的 ID,否则将被忽略
    【解决方案2】:

    更新 2022-01:可以在 here 找到当前技术堆栈(Eclipse 4.17 / 2020-09)的更新答案/解决方案 (旧:4.6 / 2017)

    在没有额外的 ...&lt;id&gt;httpsproxy&lt;/id&gt;... 条目(如@Krzysztof Krasoń 所述)和它(如提问者所述)的情况下工作。 对我们来说问题是,Eclipse-&gt;Maven-&gt;User Settings-&gt;[x] Update Settings 显然根本不起作用,并且必须检查某些东西 Eclipse-&gt;Maven-&gt;[x] Download repository index updates on startup(例如 Maven Repositories View-&gt;Global Repositories-&gt;central-&gt;Update Index)。最重要的是:

    Eclipse 必须在每次settings.xml 更新后重新启动! :-/

    我猜这是错误或重新加载/缓存问题。 我们成功地测试了它

    • 开普勒 (4.3) 和霓虹灯 (4.6)
    • 及其嵌入式 Maven 版本 (3.2.1 / 3.3.9) 以及外部 3.3.3
    • 带有http://https:// 网址

    【讨论】:

      【解决方案3】:

      我对 Eclipse Maven 的测试表明,settings.xml 中的 protocol 指的是 代理服务器 的协议,而不是 URL 请求 的协议。它还表明 Maven 只使用列出的第一个活动代理服务器,而忽略其余的。

      这是我的证据:

      1. documentation 表示

      active:如果此代理处于活动状态,则为 true。这对于声明一组代理很有用,但一次只能激活一个。

      protocol、host、port:代理的protocol://host:port,分成离散的元素。”

      2。 source code 更清晰:

          /**
           * Get the protocol of the proxy server.
           * @return the protocol of the proxy server
           */
          public String getProtocol()
          {
              return protocol;
          }
      

      3.真实世界的测试(使用 Eclipse Maven):

      一个。第一个代理是伪造的 ftp,第二个是真正的 http,第三个是真正的 https。结果:失败。

      如果协议是针对 URL 请求的,那么 Maven 会查找真正的 http/https 代理并且工作得非常好。相反,它使用了第一个代理,尽管它是“ftp”,但失败了。

          <proxies>
              <proxy>
                  <id>bogus_ftp</id>
                  <active>true</active>
                  <protocol>ftp</protocol>
                  <port>123</port>
                  <host>bogus.proxy.com</host>
              </proxy>
              <proxy>
                  <id>real_http</id>
                  <active>true</active>
                  <protocol>http</protocol>
                  <port>123</port>
                  <host>real.proxy.com</host>
              </proxy>
              <proxy>
                  <id>real_https</id>
                  <active>true</active>
                  <protocol>https</protocol>
                  <port>123</port>
                  <host>real.proxy.com</host>
              </proxy>
          </proxies>
      

      b.第一个代理是真正的 http,第二个是虚假的 https。结果:成功。

      这表明它只使用了第一个代理。否则,它会使用第二个代理来处理 https 请求,访问伪造的代理服务器,然后失败。

          <proxies>
              <proxy>
                  <id>real_http</id>
                  <active>true</active>
                  <protocol>http</protocol>
                  <port>123</port>
                  <host>real.proxy.com</host>
              </proxy>
              <proxy>
                  <id>bogus_https</id>
                  <active>true</active>
                  <protocol>https</protocol>
                  <port>123</port>
                  <host>bogus.proxy.com</host>
              </proxy>
          </proxies>
      

      c.两者都是http,但第一个代理是假的,第二个是真实的。结果:失败。

      这表明 maven 不使用多个代理,即使对于同一个协议也是如此。否则,它会尝试第二个真正的代理并成功。

          <proxies>
              <proxy>
                  <id>bogus_http</id>
                  <active>true</active>
                  <protocol>http</protocol>
                  <port>123</port>
                  <host>bogus.proxy.com</host>
              </proxy>
              <proxy>
                  <id>real_http</id>
                  <active>true</active>
                  <protocol>http</protocol>
                  <port>123</port>
                  <host>real.proxy.com</host>
              </proxy>
          </proxies>
      

      【讨论】:

      • 亲爱的@wisbucky,在所有 3 次测试中,您忘记为代理声明指定不同的 id。如果您指定不同的 ID,那么它可以工作。问题可能是 Maven 在丢失时会生成一个默认 id,并且它会为所有代理声明生成相同的 id。您能否再试一次所有示例但使用有效的不同 ID,并告诉我们它是否确实与多个活动代理一起工作?
      • @SorinPostelnicu,这是一个很好的观点。我用不同的&lt;id&gt;s 重新测试了所有 3 个示例(我编辑了帖子以反映这一点)。结果与之前完全相同。您可能可以利用带有命令行参数的 ids,但 Eclipse Maven 默认情况下不会。
      • 它在从命令行运行 mvn 时有效,但实际上我没有使用 Eclipse Maven 进行测试。如果它不起作用,那么它应该作为 Elipse Maven 的错误提交。
      【解决方案4】:

      我解决了更新maven版本的问题,或者换句话说不是使用嵌入式eclipse maven版本,而是使用外部版本3.3.9。

      【讨论】:

        【解决方案5】:

        对于带有 M2E 1.16.1Eclipse 4.17 (2020-09)它应该特别适用于那里! )和 Maven 3.3.3(外部)或 3.6.3(嵌入式)(以及可能类似的组合/版本)它适用于 混合的 http://...https://... repo具有以下设置的网址past 除外):

        例如使其适用于settings.xmlpom.xml

        • &lt;url&gt; https://repo.maven.apache.org/maven2 &lt;/url&gt;
        • &lt;url&gt; http://my-local-repo/repository/rep1 &lt;/url&gt;
        • &lt;url&gt; http://my-local-sonatype-nexus-repo-manager-oss-v3/repository/rep2 &lt;/url&gt;

        你需要:

        1. 两个条目在您的 &lt;usr-home&gt;/.m2/settings.xml 中,如果某些 repos 具有 http:// 和一些 https:// URL(不幸的是,不像文档或旧 Maven 或 m2e 版本/组合中所述) p>

           <proxy>
               <id>http</id>
               <active>true</active>
               <protocol>http</protocol>
               <port>8080</port>
               <host>some-proxy.com</host>
           </proxy>
          
           <proxy>
               <id>https</id>  <!-- important!: different id than above! -->
               <active>true</active>
               <protocol>https</protocol>
               <port>8080</port>
               <host>some-proxy.com</host>
           </proxy>
          
        2. 此外,如果
          Window -> Preferences -> Maven -> [x] 下载存储库索引更新,Eclipse M2E 插件存在根本不同步的问题启动时未启用 (=> 因此可以将其想象为:“[x] 启用存储库索引更新(在启动时额外)

        3. 此外一些回购,例如已知 Sonatype 的 Nexus Repository Manager v3(至少 3.2),不支持索引(另请参阅 feature request NEXUS-17279),因此至少有两个选项:

        4. 为确保不会遇到缓存或崩溃问题,您应该重新启动 Eclipse(例如使用 -clean 选项),以防在上述设置后出现问题

        当然,如果不建立索引,将失去在 repo 工件中搜索的能力,但直接下载应该始终有效

        • 例如通过 pom.xml -> 右键单击​​ -> Maven -> 添加依赖项 -> 输入 groupId, artifactId ...
          • 如果你输入groovy,应该有相当多的建议如果它有效,否则可能会显示一些“artifactId不能为空”警告

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-23
          • 1970-01-01
          • 1970-01-01
          • 2017-05-21
          • 2016-09-16
          • 2016-11-18
          • 1970-01-01
          相关资源
          最近更新 更多