如何通过代理使用 Maven?

我想分享一下我通过代理使用 Maven 的经验。

您很可能会遇到以下异常和消息:

repository metadata for: 'org.apache.maven.plugins' could not be retrieved from
repository: central due to an error: Error transferring file: Connection refused: connect

或者

[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-clean-
plugin:2.5: Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its
dependencies could not be resolved: Failed to read artifact descriptor for
org.apache.maven.plugins:maven-clean-plugin:jar:2.5

如何配置 Maven 使用代理服务器?

313860 次浏览

有关为 Maven 设置代理的详细信息,请参见 迷你导游

实际上,您需要确保全局设置([maven install]/conf/settings.xml)或用户设置(${user.home}/.m2/settings.xml)中的代理部分配置正确。最好在用户设置中执行此操作,以避免将密码存储在公共位置的纯文本中。

Maven 2.1引入了 密码加密,但我还没来得及检查加密是否适用于代理设置和存储库密码(不明白为什么它不适用)。

对于信息,在 setings.xml 中有一个注释掉的代理配置,以及关于如何修改它的说明。

在迷你指南中,你的设置应该是这样的:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
[...]
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>proxy.somewhere.com</host>
<port>8080</port>
<username>proxyuser</username>
<password>somepassword</password>
<nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
</proxy>
</proxies>
[...]
</settings>

这些最有可能是由两个问题引起的:

  1. 您需要向 setings.xml 添加代理配置。在你的用户名字段中有一个技巧。确保它看起来像域用户名。在那里设置域并放置精确的斜杠非常重要’。您可能需要使用 < ![ CDATA []] > 标记,如果您的密码包含非 xml 友好字符。
  2. 我注意到有时候 Maven2.2.0根本不能通过代理工作,而2.2.1完全可以工作。

如果省略了其中一些错误,那么 maven 可能会因为随机错误消息而失败。

只希望我能让某人不用像我一样花6个小时在谷歌上搜索这个问题。

我知道这不是一个真正的问题的答案,但它可能是值得知道的人搜索这篇文章。也可以安装像 联系这样的 Maven 存储库代理。

您的专家将被配置为与本地 Nexus 代理联系,然后 Nexus 将检索(并缓存)工件。它可以通过 Web 界面进行配置,并支持(http)代理。

这可能是一个优势,特别是在公司环境中,因为工件在本地可用,并且可以快速下载,而且您不再那么依赖于外部 Maven 存储库的可用性。

为了回到这个问题,使用 Nexus,代理配置有一个很好的 GUI,并且它只需要在一个地方完成,而不是针对每个开发人员。

如何使用袜子代理?

在某处设置到服务器的 SSH 隧道:

ssh -D $PORT $USER@$SERVER

Linux (bash) :

export MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"

视窗:

set MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"

为了补充这个话题,以下是我的经历... ... 非常奇怪和费时,所以我认为值得补充。

我在 Windows 上尝试构建 portlet-bridge 时遇到过类似的问题,出现了以下错误:

Downloading: http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
[DEBUG] Reading resolution tracking file C:\Documents and Settings\myuser\.m2\repository\org\apache\portals\bridges-pom\1.0\bridges-pom-1.0.pom.lastUpdated
[DEBUG] Writing resolution tracking file C:\Documents and Settings\myuser\.m2\repository\org\apache\portals\bridges-pom\1.0\bridges-pom-1.0.pom.lastUpdated
[ERROR] The build could not read 1 project -> [Help 1]
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM: Could not transfer artifact
org.apache.portals:bridges-pom:pom:1.0 from/to central (http://repo1.maven.org/maven2): Error transferring file: repo1.maven.org and 'parent.relativePath' points at wrong local
POM @ line 23, column 11
...
[ERROR]   The project org.apache.portals.bridges:portals-bridges-common:2.0 (H:\path_to_project\portals-bridges-common-2.0\pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM: Could not transfer artifact org.apache.portals:bridges-pom:pom:1.0 from/to central (http://repo1.maven.org/maven2):
Error transferring file: repo1.maven.org and 'parent.relativePath' points at wrong local POM @ line 23, column 11: Unknown host repo1.maven.org -> [Help 2]
...
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

我尝试了一些事情,比如冲浪:

  • 尝试将 Parent.relativePath 设置为空,这样 maven 就不会认为父节点是本地节点。这是根据建议的所以在 Hudson 构建失败: 不可解析的父 POM在这个神圣的论坛上。这没有效果。

  • 我还尝试确保存储库在 setings.xml 中显式列出,但这也没有效果。

  • 然后,我确保 mvn 被迫查找存储库,而不是像 作者: Sarthon中所讨论的那样依赖于它自己的历史记录。不幸的是,这也不是问题所在。

  • 无奈之下,我重新访问了 MAVEN _ OPTS,以确保我没有违反代理设置。这些说法是正确的,尽管其价值没有被引用:

    设置 MAVEN _ OPTS =-dhttp.proxyHost = myproxy.mycompany.com -dhttp.proxyPort = 8080-Xmx256m

  • 最后,我将代理配置移动到 setings.xml 中,这样就可以工作了:

    <proxies>
<proxy>
<id>genproxy</id>
<active>true</active>
<protocol>http</protocol>
<!--username>proxyuser</username-->
<!--password>proxypass</password-->
<host>myproxy.mycompany.com</host>
<port>8080</port>
<nonProxyHosts>*.mycompany.com|127.0.0.1</nonProxyHosts>
</proxy>
</proxies>

真的不知道为什么我最初的 MAVEN _ OPTS 不工作(引号?)而 setings.xml 配置确实可以工作。我想反向修复并再次检查每个步骤,但是已经浪费了太多的时间。会及时汇报的。

我也有这个问题,我解决了它通过编辑 settings.xml文件在我的 .m2文件夹。 我的 settings.xml现在是这样的:

<settings>
<proxies>
<proxy>
<id>genproxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxyHost</host>
<port>3128</port>
<username>username</username>
<password>password</password>
</proxy>
</proxies>
</settings>

还要注意,有些插件(想到远程资源)使用的是一个真正老的库,只接受通过 MAVEN _ OPTS 的代理配置;

-Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port> -Dhttps.proxyHost=<host> -Dhttps.proxyPort=<port>

你可能会因为这个卡住。

除了上面提到的技术之外,通过一些努力,您可以使用 jproxyloader 库通过代理运行 maven (页面上有如何做到这一点的示例: http://jproxyloader.sourceforge.net/)。这允许设置袜子代理只用于下载工件。

在 duanni (set-DsocksProxyHost)提到的解决方案中有一个问题。如果您有针对本地数据库运行的集成测试(或者其他连接到 url 的测试,这些测试不应该通过代理进行)。这些测试将停止工作,因为到数据库的连接也将定向到代理。在 jProxyLoader 的帮助下,您可以只为 nexus 主机设置代理。此外,如果需要,还可以通过另一个代理将连接传递到数据库。

上面的帖子帮助我解决了问题。除了上述内容,我还必须做以下修改才能使其发挥作用:

  • 修改 Maven 的 JRE net 设置(JRE lib net.properties)以使用系统代理设置。

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
    
  • Included proxy server settings in settings.xml. I did not provide username and password settings as to use NTLM authentication.

再加上我自己的经验: 我公司的代理是 http://webproxy.intra.companyname.com:3128。为了让 maven 通过这个代理工作,设置必须是这样的 没错

<settings>
<proxies>
<proxy>
<id>default</id>
<active>true</active>
<protocol>http</protocol>
<host>webproxy.intra.companyname.com</host>
<port>3128</port>
</proxy>
</proxies>
</settings>

与其他一些代理配置文件不同,这里的 protocol描述了如何连接到代理服务器,而不是应该代理哪种类型的协议。目标的 http部分必须从主机名中分离出来,否则就无法工作。

如果 maven 是通过代理工作的,但不是它调用的某些插件,那么尝试使用 -Dhttp*.proxy*设置来设置 JAVA_TOOL_OPTIONS

如果你已经有 JAVA_OPTS了,那就做吧

export JAVA_TOOL_OPTIONS=$JAVA_OPTS

设定 Maven Proxy:

编辑 ~/. m2/setings.xml 文件中的代理会话。如果找不到文件,创建一个。

<settings>
<proxies>
<proxy>
<id>httpproxy</id>
<active>true</active>
<protocol>http</protocol>
<host>your-proxy-host</host>
<port>your-proxy-port</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
<proxy>
<id>httpsproxy</id>
<active>true</active>
<protocol>https</protocol>
<host>your-proxy-host</host>
<port>your-proxy-port</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>


</proxies>
</settings>

或者

编辑 { M2 _ HOME }/conf/setings.xml中的代理会话

谢谢@krosenvold。

如果设置文件更改不起作用,请在命令提示符中尝试使用 POM 文件。

mvn install -Dhttp.proxyHost=abcproxy -Dhttp.proxyPort=8080 -Dhttps.proxyHost=abcproxy -Dhttps.proxyPort=8080

这在密码更改后立即对我有所帮助。

我在本地运行 cntlm,配置了 NTLMv2密码哈希,以便通过公司代理进行身份验证,并使用

export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=3128"

当然你使用的代理应该支持 cntlm/NTLMv2

有时需要添加其他 <proxy></proxy>标记,并在协议标记中指定 https: <protocol>https</protocol>

如果你是 Maven 的新代理设置在我的情况下,首先去检查你的主文件夹天气有 .m2文件夹,在它应该有一个名为 settings.xml的文件,如果没有创建它,并粘贴这个,改变 hostport,然后如果需要改变 nonProxyHosts

主文件夹-C: 用户{用户名}

<settings>
<proxies>
<proxy>
<id>httpproxy</id>
<active>true</active>
<protocol>http</protocol>
<host>your-proxy-host</host>
<port>your-proxy-port</port>
<nonProxyHosts>localhost</nonProxyHosts>
</proxy>
<proxy>
<id>httpsproxy</id>
<active>true</active>
<protocol>https</protocol>
<host>your-proxy-host</host>
<port>your-proxy-port</port>
<nonProxyHosts>localhost</nonProxyHosts>
</proxy>


</proxies>
</settings>

如果任何情况下,这不成功去,并在这个位置的家庭文件夹的变化

/conf/settings.xml

我正在使用 Eclipse 作为我的 IDE
希望这个能帮上忙! !

注: 要删除代理,只需将 settings.xml移动到其他地方

Maven 提供了一个内置的方法,通过一个名为 Setings.xml的文件来实现这一点,这个问题已经在其他答案中得到了讨论。但是,命令行工具通常自动使用 使用环境变量指定的代理服务器,特别是在 Linux 中。

为了遵循 不要重复自己的原则(这是为了帮助您避免错误) ,如果 mvn也能自动与之一起工作就好了。

下面是一个执行必要转换的 shell 脚本:

#! /usr/bin/env bash


function javaproxy {
## using "Shell Parameter Expansion"
request_scheme=$1 ; proxy=$2
notscheme=$(echo ${proxy#*://}) ## parse
scheme=$(echo ${proxy%${notscheme}}) ## remove
scheme=$(echo ${scheme%://}) ## strip
hostport=$(echo ${proxy#*//*}) ## parse
host=$(echo ${hostport%:*}) ## parse
port=$(echo ${hostport#${host}}) ## remove
port=$(echo ${port#:}) ## strip
scheme=$(echo ${scheme:-http}) ## default
host=$(echo ${host:-localhost}) ## default
port=$(echo ${port:-8080}) ## default
echo -n " -D${request_scheme}.proxyHost=${host}"
echo -n " -D${request_scheme}.proxyPort=${port}"
}


JTO=""


if [ $http_proxy ] ; then
JTO="${JTO}$(javaproxy http ${http_proxy})"
fi


if [ $https_proxy ] ; then
JTO="${JTO}$(javaproxy https ${https_proxy})"
fi


if [ $no_proxy ] ; then
JTO="${JTO} -Dhttp.nonProxyHosts=$(echo \"${no_proxy}\"|tr ',' '|')"
fi


export JAVA_TOOL_OPTIONS=${JTO}
echo "JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS}"


mvn_friendliness_options+=--update-snapshots
mvn ${mvn_friendliness_options} $@

您可以将其命名为类似于 proxied_mvn的东西,并将其运行为:

$ https_proxy=http://localhost:58080 ./proxied_mvn clean package

或者,您可以将环境设置移动到启动脚本中。

抓到你了

在尝试配置 Maven 以通过代理访问 Nexus时,可能会出现许多错误。希望这个脚本能够帮助解决一些最棘手的问题,但是还有一些问题没有解决:

  • Nexus 凭据可用且正确(仅在需要时)

    检查 mvn help:effective-settings

  • Maven 缓存: < a href = “ https://stackoverflow.com/q/4856307/86967”> “解析将不会被重新尝试”

    mvn clean package --update-snapshots

  • Maven 文本墙输出——必须仔细查看输出,以确保不同运行之间的错误消息没有细微差别

  • 旧版本的 Java 可能需要 _JAVA_OPTIONS而不是 JAVA_TOOL_OPTIONS

结束语

代理不止一种。相应地,对这个问题的解释不止一种——造成这里有大量不同的答案。

我已经明确地解决了(转发 HTTP/HTTPS) 网络代理服务器的情况,它用于从公司网络内访问互联网(对于一些公司)。这可能明显不同于 SOCKS 代理,它也在这里的一些答案中得到了解决。

哦,顺便说一下,因为它使用 JAVA_TOOL_OPTIONS,这个解决方案也可以应用到 在代理中运行其他 Java 应用程序


分手提示... 我上面的例子使用 http://localhost:58080。这是因为我在 远程访问客户机上使用 WSL运行以设置从 CLIENT_PROXY=localhost:58080到实际网络代理的端口转发:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY