【发布时间】: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(上图)的注释是正确的,我的任务是寻求满足以下条件的解决方案:
- 如何在settings.xml中写代理入口来支持选择 通过系统属性或命令行开关代理?
- 如何设置系统属性或命令行开关, 选择所需的代理?
- 您在家时如何关闭所有代理?
- 实现 (1)、(2) 和 (3) 无需每次编辑 settings.xml 移动的时间。
- 提议的解决方案必须在 Linux 和 Windows 上均适用。
- 建议的解决方案应尽可能减少命令行输入。
已经尝试不成功
使用配置文件设置然后在代理中使用的属性: 失败:抱怨 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 WORK、git checkout WORK1或git checkout HOME,这将简化为每个位置的单个命令,并且您无需在 maven 调用中添加补充参数。跨度> -
@khmarbaise 是的,就像 coderplus 的答案一样,这可能有效,但我真的希望得到一个更专业的答案。令人讨厌的是,maven 似乎为它需要的所有信息提供了空间,允许您从命令行或作为激活的一部分选择代理,但实际这样做的方式除外。
-
通常你不会只使用一个不同的存储库/代理。所以
git-way 是你能做的最好的(或者你可以为此创建一些脚本)。除此之外,这对我来说已经工作了 3 年多...如果你想在 Maven 中拥有这样的机会,你可以开始创建一个 jira 并根据需要创建一个补丁。 -
“通常”取决于您的经验 ;-) 我经常与其他公司的承包商合作,他们在我们当地的办事处、当地办事处和家中工作。只是我之前没有在那个环境中使用过 Maven,所以我没有遇到代理问题。我仍然希望得到另一个答案。
-
@khmarbaise 它看起来像 Jira,补丁将成为方式。我将在不确定的将来查看代码,看看是否可以轻松地将代理(和镜像)插入到允许放入配置文件的内容中。