【问题标题】:Choosing which proxy to use in maven?选择在 Maven 中使用哪个代理?
【发布时间】:2014-09-19 21:37:18
【问题描述】:

我正在使用 Maven 3.x。我知道如何在 .m2/settings.xml 文件中配置代理。我无法弄清楚的是如何指定使用哪个代理,无论是在命令行上,还是通过某些系统属性。此注释出现在 maven.apache.org 提供的示例 settings.xml 中:

This is a list of proxies which can be used on this machine to connect to the network.
Unless otherwise specified (by system property or command-line switch), the first proxy
specification in this list marked as active will be used.

但我没有找到任何地方告诉你 (a) 如何在 settings.xml 中设置代理以支持上述你可以选择使用哪个代理的论点,或者 (b ) 如何在命令行中指定使用哪个代理。

假设如下:

<settings>
  <proxies>
    <proxy>
      <id>work-one</id>
      <protocol>http</protocol>
      <host>1.2.3.4</host>
      <port>80</port>
      <nonProxyHosts>127.0.0.1,localhost,foo...</nonProxyHosts>
    </proxy>
    <proxy>
      <id>work-two</id>
      <protocol>http</protocol>
      <host>5.6.7.8</host>
      <port>80</port>
      <nonProxyHosts>127.0.0.1,localhost,bar...</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

其实有三种情况。

  • Office One:您需要使用 work-one 代理的地方。
  • 办公室二:需要使用工作二代理的地方。
  • 首页:不需要代理的地方。

因此,假设来自示例 settings.xml(上图)的注释是正确的,我的任务是寻求满足以下条件的解决方案:

  1. 如何在settings.xml中写代理入口来支持选择 通过系统属性或命令行开关代理?
  2. 如何设置系统属性或命令行开关, 选择所需的代理?
  3. 您在家时如何关闭所有代理?
  4. 实现 (1)、(2) 和 (3) 无需每次编辑 settings.xml 移动的时间。
  5. 提议的解决方案必须在 Linux 和 Windows 上均适用。
  6. 建议的解决方案应尽可能减少命令行输入。

已经尝试不成功

使用配置文件设置然后在代理中使用的属性: 失败:抱怨 nonProxyHosts 中的正则表达式错误和端口中的非整数,尽管事实上该配置文件已在命令中说明通过 -P 参数行,并且配置文件声明在代理声明之前。见1608079,它对我不起作用,如果它起作用了,你怎么会完全不指定代理?

% mvn -U -P workone
... usual stuff...
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unable to parse element 'port', must be an integer (position: END_TAG seen ...<port>${proxy-port}</port>... @243:30) caused by: java.lang.NumberFormatException: For input string: "${proxy-port}"
... more stuff ...
[ERROR] Internal error: java.util.regex.PatternSyntaxException: Illegal repetition near index 0
[ERROR] ${proxy-no_proxy}
[ERROR] ^

settings.xml 是这样的:

<settings>
...

  <profile>
    <id>workone</id>
    <properties>
        <proxy-protocol>http</proxy-protocol>
        <proxy-port>80</proxy-port>
        <proxy-host>hostnameone</proxy-host>
        <proxy-no_proxy>127.0.0.1,127.0.1.1,localhost,machine,*.local,*.domain.name.com</proxy-no_proxy>
    </properties>
  </profile>

  <profile>
    <id>worktwo</id>
    <properties>
        <proxy-protocol>http</proxy-protocol>
        <proxy-port>80</proxy-port>
        <proxy-host>hostnametwo</proxy-host>
        <proxy-no_proxy>127.0.0.1,127.0.1.1,localhost,machine,*.local,*.other.domain.name.com</proxy-no_proxy>
    </properties>
  </profile>
</profiles>
<proxies>
    <proxy>
        <protocol>${proxy-protocol}</protocol>
        <host>${proxy-host}</host>
        <port>${proxy-port}</port>
        <nonProxyHosts>${proxy-no_proxy}</nonProxyHosts>
    </proxy>
</proxies>
</settings>

假设 id 是代理的“配置文件名称”: 失败:由于您不希望默认使用代理,因此必须将 active 设置为 false。如果您不使用活动,则默认为 true,并自动使用第一个活动代理。如果设置 active=false,-P work-one 不会打开代理。如果您将它们都设置为 active=true,则无论如何都会使用第一个,如果您不在该代理后面,则它不起作用,并且当您在家时也不起作用。

Java 系统属性: 失败:有一些示例建议为代理设置 Java 系统属性,但是这些示例还表明它不适用于常见于行家。它还会导致在命令行上输入大量内容,这是一种不太理想的情况。

Linux 脚本:失败,不适用于 Windows:是的,我有一个 Linux 脚本可以为我使用的各种工具设置代理,但该解决方案不适用于Windows,因此不是这个问题的答案。这也很尴尬,因为如果在您登录之前网络没有正确连接,您最终会得到虚假的代理信息。 (修复网络,注销,重新登录,代理好了,呃。)


中期结果: 答案似乎是没有 maven-ish 方法来处理这个问题,或者 settings.xml 文件中还有一堆其他的东西。因此,我目前无限期拒绝接受答案。

配置文件看起来是最有可能解决此问题的地方,但proxies 不是您可以在profile 块内输入的块之一,mirrors 也不是我遇到的其他事情需要三种方式来设置它)。

【问题讨论】:

  • 我建议在 '${HOME}/.m2/' 中创建一个 git 存储库并签入 settings.xml。为每个位置创建一个分支,我只需要简单地更改位置git checkout WORKgit checkout WORK1git checkout HOME,这将简化为每个位置的单个命令,并且您无需在 maven 调用中添加补充参数。跨度>
  • @khmarbaise 是的,就像 coderplus 的答案一样,这可能有效,但我真的希望得到一个更专业的答案。令人讨厌的是,maven 似乎为它需要的所有信息提供了空间,允许您从命令行或作为激活的一部分选择代理,但实际这样做的方式除外。
  • 通常你不会只使用一个不同的存储库/代理。所以git-way 是你能做的最好的(或者你可以为此创建一些脚本)。除此之外,这对我来说已经工作了 3 年多...如果你想在 Maven 中拥有这样的机会,你可以开始创建一个 jira 并根据需要创建一个补丁。
  • “通常”取决于您的经验 ;-) 我经常与其他公司的承包商合作,他们在我们当地的办事处、当地办事处和家中工作。只是我之前没有在那个环境中使用过 Maven,所以我没有遇到代理问题。我仍然希望得到另一个答案。
  • @khmarbaise 它看起来像 Jira,补丁将成为方式。我将在不确定的将来查看代码,看看是否可以轻松地将代理(和镜像)插入到允许放入配置文件的内容中。

标签: maven proxy maven-3


【解决方案1】:

mvn 有一个-s 开关

-s,--settings <arg>                    Alternate path for the user
                                        settings file

我无法从命令提示符动态切换代理。所以我最终创建了 3 个单独的设置文件(每个代理一个),比​​如 work1-settings.xml、work2-settings.xml、settings.xml(用于家庭网络)。

我已经设置了 Windows 环境变量,例如

WORK1=-s c:\Users\coderplus\.m2\work1-settings.xml
WORK2=-s c:\Users\coderplus\.m2\work2-settings.xml

在家的时候,我会用

mvn clean install

(这将选择默认的 settings.xml 文件)

在工作时,我会使用

mvn clean install %WORK1%

在work2的时候,我会用

mvn clean install %WORK2%

【讨论】:

  • 这可行,但我真的希望得到一个更专业的答案。我的意思是,如果您不能使用它来选择哪个代理处于活动状态,那么在代理块中有一个“id”有什么意义?
  • 虽然这是几年前的事了,但我还是决定接受这个答案是最不痛苦的。
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2013-01-13
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多