如何通过代理使用Maven?

我想分享我通过代理使用maven的经验。

你很可能面临exception和消息,如:

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

如何configurationMaven使用代理服务器?

有关设置Maven代理的详细信息,请参阅迷你指南 。

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

Maven 2.1引入了密码encryption ,但是我没有仔细检查encryption是否适用于代理设置以及存储库密码(不知道为什么它不会)。

有关信息,您的settings.xml中有一个注释掉的代理configuration,以及如何修改它的说明。

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

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

如何使用袜子代理?

build立到某个服务器的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" 

我也有这个问题,我通过编辑我的.m2文件夹中的settings.xml文件解决了它。 我的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> 

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

  1. 您需要将代理configuration添加到您的settings.xml。 这是您的用户名字段中的一个技巧。 确保它看起来像域\用户名。 在那里设置域,并把这个确切的斜线是重要的'\'。 如果您的密码包含非xml友好字符,您可能需要使用<![CDATA []]>标签。
  2. 我已经注意到maven 2.2.0有时候通过代理工作,2.2.1工作得很好。

如果其中一些被省略 – maven可能会失败,随机错误消息。

只是希望我已经救了一些人在这个问题上search了6个小时,就像我一样。

另外请注意,一些插件(想到远程资源)使用一个真正的老库,只接受通过MAVEN_OPTS代理configuration;

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

你可能会被卡在auth这个。

只需添加我自己的经验:我公司的代理是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> 

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

设置Maven代理

编辑〜/ .m2 / settings.xml文件中的代理会话。 如果找不到文件,请创build一个。

 <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/settings.xml中的代理会话

希望能帮助到你.. :)

并添加到这个话题,这里是我的经验下面…真奇怪,耗时,所以我认为这是值得补充。

我有一个类似的问题试图在Windows上构buildportlet桥,得到以下错误:

正在下载:http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
 [DEBUG]读取分辨率跟踪文件C:\ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
 [DEBUG]写入parsing跟踪文件C:\ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
 [错误]构build无法读取1个项目 - > [帮助1]
 org.apache.maven.project.ProjectBuildingException:在处理POM时遇到了一些问题:
 [致命]不可parsing的父母POM:无法传输工件 
  org.apache.portals:bridges-pom:pom:1.0从/到central(http://repo1.maven.org/maven2):传输文件错误:repo1.maven.org和'parent.relativePath'指向错误的本地 
  POM @第23行第11栏
 ...
 org.apache.portals.bridges:portals-bridges-common:2.0(H:\ path_to_project \ portals-bridges-common-2.0 \ pom.xml)有一个错误
 [ERROR]无法parsing的父POM:无法传输工件org.apache.portals:bridges-pom:pom:1.0 from / to central(http://repo1.maven.org/maven2):
 传输文件时出错:repo1.maven.org和'parent.relativePath'指向错误的本地POM @第23行,第11列:未知主机repo1.maven.org  - > [Help 2]
 ...
 [错误]有关错误和可能的解决scheme的更多信息,请阅读以下文章:
 [错误] [帮助1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
 [错误] [帮助2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

我尝试了几件事情,接着进行了一些冲浪:

  • 试图设置parent.relativePath为空,所以maven不认为父母是本地的。 这是根据在哈德森 SObuild议失败:不可解决的父母POM和在这个讨论的论坛 。 这没有效果。

  • 我也尝试确保存储库明确列在我的settings.xml中,但这也没有效果。

  • 然后我确保mvn被迫查找存储库,而不是依靠它自己的历史,正如Sarthon在这个博客中所讨论的那样 。 不幸的是,这也不是问题。

  • 在一些绝望的情况下,我重新访问了我的MAVEN_OPTS,以确保我没有对我的代理设置犯规。 这些都是正确的,尽pipe这个价值没有被引用:

    设置MAVEN_OPTS = -Dhttp.proxyHost = myproxy.mycompany.com -Dhttp.proxyPort = 8080 -Xmx256m

  • 所以,最后,我把代理configuration移动到我的settings.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不工作(引号?),而settings.xmlconfiguration工作。 我想扭转修复方法,再次检查每一步,但浪费了太多的时间。 将作为时间回报。

我知道这不是真正的问题的答案,但可能值得知道某人search这个职位。 也可以安装像nexus这样的Maven仓库代理。

您的maven将被configuration为联系本地Nexus代理,然后Nexus将检索(并caching)这些工件。 它可以通过Web界面进行configuration,并支持(http)代理)。

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

回到问题上来; Nexus有一个很好的代理configurationGUI,只需要在一个地方完成,而不是每个开发者。

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

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

上述post有助于解决我的问题。 除了上述,我不得不作出以下更改,使其工作:

  • 修改Maven的JREnetworking设置(\ jre \ lib \ net.properties)来使用系统代理设置。 https.proxyHost =代理DNS https.proxyPort =代理端口

    • 在settings.xml中包含代理服务器设置。 我没有提供使用NTLM身份validation的用户名和密码设置。

如果maven通过代理工作,但不是它调用的一些插件,可以尝试设置JAVA_TOOL_OPTIONS以及-Dhttp*.proxy*设置。

如果你已经有了JAVA_OPTS就行了

 export JAVA_TOOL_OPTIONS=$JAVA_OPTS