如何通过代理使用Maven?


130

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

您很可能会遇到异常和消息,例如:

无法从以下位置获取“ org.apache.maven.plugins”的存储库元数据 
存储库:由于错误而处于中央:错误传输文件:拒绝连接:connect

要么

[警告]无法检索org.apache.maven.plugins:maven-clean-的插件描述符
插件:2.5:插件org.apache.maven.plugins:maven-clean-plugin:2.5或其中之一 
依赖关系无法解析:无法读取工件描述符 
org.apache.maven.plugins:maven-clean-plugin:jar:2.5

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


(任何人)介意将此改为一个实际问题(例如:如何通过代理使用Maven?)?然后,您可以将您的问题正文作为答案发布,以更加符合StackOverflow格式。.–
Tim

我为您改过了字眼Bogdan,请根据需要发布您的原始内容作为答案
Rich Seller

看起来我们是在同一时间编辑的
Rich Seller

Answers:


145

有关为Maven设置代理的详细信息,请参见mini guide

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

Maven 2.1引入了密码加密,但是我还没有全面了解加密是否适用于代理设置以及存储库密码(不知道为什么不这样做)。

有关信息,在settings.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>

谢谢,但是这篇文章对其他人来说是一个提示,而不是一个问题。我已经解决了这个问题,但是花了很多时间在非显而易见的事情上。我张贴了这个,这样对某人可能有用。
博格丹

7
在m2目录中找不到setting.xml文件。知道为什么吗?@Rich Seller
Ariox66

5
你必须把它放在那里。您可以从maven_home(解压缩Maven二进制文件的位置)中找到一个示例settings.xml。
拉维

而且,如果代理不需要身份验证,则必须删除<username><password>元素(并且不能提供空内容)。这花了我一段时间才能弄清楚。
dmcontador

50

如何使用袜子代理?

设置到服务器的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"

2
通过袜子代理MAVEN_OPTS是我可以使Maven通过HTTPS下载的唯一方法。使用HTTP或HTTPS代理(通过MAVEN_OPTSsettings.xml)会导致org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RetryExec execute INFO: I/O exception (java.net.SocketException) caught when processing request to {tls}->http://proxy.mycompany.com:911->https://repo.maven.apache.org:443: SOCKS: TTL expired
MihaiCapotă16

对于http代理人:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
Omid

太好了,谢谢。如果只想对一个命令使用一次这些选项,则可以键入:同一会话中MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean install的下一个mvn命令将没有任何代理。
埃里克·杜米尼尔

29

我也遇到了这个问题,我通过编辑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>

1
就我而言,这不是下载jar文件。我已经尝试了一切
Faizan Mubasher

28

还要注意,有些插件(想到了远程资源)使用的是一个很老的库,该库仅通过MAVEN_OPTS接受代理配置。

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

您可能对此一无所知。


在Ubuntu 14.04上使用Ubuntu仓库中的maven 3.0.5不适用于我。在settings.xml文件中配置代理有效。
MihaiCapotă2015年

1
在Ubuntu 14.04和Maven 3.0.4上为我工作
rmv

需要以这种方式设置MAVEN_OPTS的一个示例是使用Maven从源代码构建Maven。如果没有MAVEN_OPTS,尽管下载了许多JAR,它也无法下载LICENSE-2.0。
永久'17

@krosenvold谢谢,这个解决方案对我有用。我已经在settings.xml中设置了代理,但是有一个cxf插件想要从wsdl生成代码,但失败了。这解决了我的问题。
Vishal Vijayan

23

设置Maven代理

〜/ .m2 / settings.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/settings.xml中编辑代理会话

希望能帮助到你.. :)


15

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

  1. 您需要将代理配置添加到settings.xml中。这是您的用户名字段中的一个技巧。确保它看起来像域\用户名。在此处设置域,并在该斜杠前加一个重要的'\'。如果您的密码包含非xml友好字符,则可能要使用<![CDATA []]>标记。
  2. 我注意到有时maven 2.2.0有时根本无法通过代理工作,而2.2.1可以正常工作。

如果忽略了其中一些-maven可能会失败,并显示随机错误消息。

只是希望我像我一样,已经避免有人在这个问题上搜寻6个小时。


您正在使用NTLM代理吗?迷你指南中的内容:“请注意,目前[NT]不支持NTLM代理,因为它们尚未经过测试。您可以使用JDK 1.4+上的相关系统属性来完成此工作。”
Rich Seller 2009年

对此不确定。那是一个公司代理,实际上离我600英里,而本周末没有系统管理人员上任。所以现在不能问任何人。找出来将会很有趣。我知道它支持http,袜子和其他协议。也许也是NTML。
博格丹

14

只是添加我自己的经验:我公司的代理是 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目标的一部分必须与主机名分开,否则它将无法正常工作。


这时我只是尝试了相反的尝试。此处的协议用于描述应使用该代理的协议。我刚刚实现了使用<protocol> https </ protocol>配置连接到http代理的https协议代理的方法
Olivier Amblet

谢谢!这对我有用!我在前面加上了“ http://”,它会失败
Jesse McCall,

11

谢谢@krosenvold。

如果设置文件更改不起作用,请在具有POM文件的命令提示符下尝试此操作。

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

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


11

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

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

使用来自的代理maven。当然,您使用的代理应该支持cntlm/ NTLMv2


为Windows设置“ MAVEN_OPTS = -DproxyHost = 127.0.0.1 -DproxyPort = 3128”
-qxo

PowerShell可以设置系统环境变量: [Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
Boggin

6

为了补充这个话题,以下是我的经历...确实很奇怪而且很耗时,所以我认为值得补充。

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

下载: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]编写分辨率跟踪文件C:\ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[错误]版本无法读取1个项目-> [帮助1]
org.apache.maven.project.ProjectBuildingException:处理POM时遇到一些问题:
[FATAL]不可解析的父POM:无法传输工件
org.apache.portals:bridges-pom:pom:1.0从/到中央(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)有1个错误
[错误]不可解析的父POM:无法将工件org.apache.portals:bridges-pom:pom:1.0从中央传输到中央(http://repo1.maven.org/maven2):
传输文件时出错:repo1.maven.org和'parent.relativePath'指向错误的本地POM @第23行,第11列:未知主机repo1.maven.org-> [帮助2]
...
[ERROR]有关错误和可能的解决方案的详细信息,请阅读以下文章:
[错误] [帮助1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[错误] [帮助2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

经过一些冲浪,我尝试了几件事:

  • 试图将parent.relativePath设置为空,以便Maven认为父级不是本地的。这是根据在Hudson构建失败时关于SO的建议:不可解析的父POM以及在此论坛中提出的。这没有效果。

  • 我还尝试确保该存储库已在我的settings.xml中明确列出,但这也不起作用。

  • 然后,我确保mvn被迫查找存储库,而不是依赖于Sarthon此博客中讨论的历史记录。不幸的是,这也不是问题。

  • 出于某种绝望,我然后重新访问了MAVEN_OPTS以确保我不会受到代理设置的影响。这些是正确的,尽管其值未引用:

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

  • 因此,最后,我将代理配置移至我的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.xml配置起作用的情况下不起作用(引号?)。我想撤消此修复程序,然后再次检查每个步骤,但是浪费了太多时间。会及时报告。


您实际上是否也在MAVEN_OPTS中指定了用户名和密码?
bcmoney 2012年

1
我认为我没有,但是我不需要代理服务器。如您所见,这是可能的。除了安全性问题,您还可以尝试一下。我知道到现在为止,您仍然遇到问题吗?
wmorrison365

4

我知道这并不是问题的答案,但是对于搜索此帖子的人来说可能是值得知道的。也可以安装像nexus这样的Maven存储库代理。

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

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

链接回到问题;使用Nexus时,有一个很好的用于代理配置的GUI,它只需要在一个地方完成,而不是针对每个开发人员。


3

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

主文件夹-C:\ Users \ {UserName}

<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其他位置


要删除代理,只需将settings.xml移动到其他位置
Akitha_MJ

1

如果maven通过代理工作,但不能通过代理调用某些插件,请尝试通过设置JAVA_TOOL_OPTIONS进行-Dhttp*.proxy*设置。

如果您已经JAVA_OPTS做过

export JAVA_TOOL_OPTIONS=$JAVA_OPTS

0

除上述技术外,您还可以花点力气,使用jproxyloader库通过代理运行Maven(页面上有示例如何执行此操作:http : //jproxyloader.sourceforge.net/)。这允许仅为下载工件设置袜子代理。

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


0

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


0

以上帖子有助于解决我的问题。除上述内容外,我还必须进行以下更改以使其起作用:

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

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
  • settings.xml中包含的代理服务器设置。我没有提供使用NTLM身份验证的用户名和密码设置。


0

Maven通过一个名为settings.xml的文件提供了一种执行此操作的内置方法,其他答案中对此进行了介绍。但是,习惯上,尤其是在Linux中,命令行工具会自动使用环境变量指定的代理https_proxy

要遵循“ 不要重复自己的原则”(该原则旨在帮助您避免错误),如果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缓存:“不会重新尝试解决方案”

    mvn clean package --update-snapshots

  • Maven文本墙输出-您必须仔细查看输出以确保两次运行之间的错误消息没有明显差异

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

结语

有不止一种代理。相应地,对这个问题的解释有多种方式-导致这里有大量不同的答案。

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

哦,顺便说一下,由于它使用JAVA_TOOL_OPTIONS,所以该解决方案也可以应用于在代理中运行其他Java应用程序


离别提示...我上面的示例使用http://localhost:58080。这是因为我CLIENT_PROXY=localhost:58080通过使用远程访问客户端上的WSL来设置从端口到实际网络代理的端口转发,以便运行:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.