繁体   English   中英

"如何在 Maven 的 settings.xml 中为 HTTP 和 HTTPS 配置代理服务器?"

[英]How to configure a proxy server for both HTTP and HTTPS in Maven's settings.xml?

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

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

提出的 Maven 错误(例如MNG-2305MNG-4394 )表明此问题已解决,但我不相信。

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

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

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

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

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

我想这是一个bug或重载/缓存问题。 我们成功地测试了它

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

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

这是我的证据:

文件说明了这一点

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

protocol ,host,port: protocol:// host:代理的端口 ,分隔成离散元素。“

2. 源代码更清晰:

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

第一个代理是真正的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>

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

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

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

  • <url> https://repo.maven.apache.org/maven2 </url>
  • <url> http://my-local-repo/repository/rep1 </url>
  • <url> http://my-local-sonatype-nexus-repo-manager-oss-v3/repository/rep2 </url>

你需要:

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

     <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. 另外 Eclipse M2E 插件存在根本不同步的问题,如果
    Window -> Preferences -> Maven -> [x] 启动时下载存储库索引更新未启用(=> 因此可以将其视为:“ [x] 启用存储库索引更新(另外在启动时)

  3. 此外,一些 repos ,例如已知的 Sonatype 的Nexus Repository Manager v3(至少 3.2),不支持索引(另见功能请求 NEXUS-17279 ),因此至少有两个选项:

  4. 为了确保不会遇到缓存或崩溃问题,您应该重新启动 Eclipse(例如,使用-clean选项) ,以防在上述设置后某些东西无法立即工作

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM