如何通过代理使用Maven?

时间:2009-08-09 11:18:47

标签: maven proxy

我想分享一下通过代理使用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以使用代理服务器?

16 个答案:

答案 0 :(得分:134)

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

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

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

有关信息,您的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>

答案 1 :(得分:40)

How to use a socks proxy?

在某处设置到服务器的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 :(得分:23)

我也有这个问题,我通过编辑.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>

答案 3 :(得分:20)

另请注意,有些插件(远程资源可以想到)使用一个非常老的库,只能通过MAVEN_OPTS接受代理配置;

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

你可能会因为这个而停留在auth上。

答案 4 :(得分: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部分必须从主机名中拆分,否则它将无效。

答案 5 :(得分:13)

这些最有可能是由两个问题造成的:

  1. 您需要将代理配置添加到settings.xml。这是您的用户名字段中的一个技巧。确保它看起来像domain \ username。在那里设置域并放置这个精确的斜线很重要'\'。您可能想要使用&lt;![CDATA []]&gt;如果您的密码包含非xml友好字符,请标记。
  2. 我注意到maven 2.2.0根本无法通过代理工作,2.2.1工作得很好。
  3. 如果省略其中一些 - maven可能会因随机错误消息而失败。

    只是希望我已经拯救了一些人在谷歌搜索这个问题6个小时,就像我一样。

答案 6 :(得分:9)

谢谢@krosenvold。

如果设置文件更改无效,请在具有POM文件的命令提示符中尝试此操作。

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

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

答案 7 :(得分:6)

要添加到这个主题,这是我在下面的经历...真的很奇怪和耗时,所以我认为值得添加。

我在尝试在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 build fail: Non-resolvable parent POMin this nabble forum上有关SO的建议。这没有效果。

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

  • 然后我确保mvn被迫查找存储库,而不是依赖于它自己的历史记录,如this blog by 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>

当settings.xml配置确实有效时,真的不确定为什么我的原始MAVEN_OPTS无效(引用?)我想扭转修复并再次检查每一步,但浪费了太多时间。将在何时报告。

答案 8 :(得分:5)

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

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

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

答案 9 :(得分:4)

我知道这不是问题的真正答案,但是对于搜索这篇文章的人来说可能值得了解。也可以安装像nexus这样的Maven存储库代理。

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

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

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

答案 10 :(得分:1)

如果maven通过代理工作但没有调用的某些插件,请尝试设置JAVA_TOOL_OPTIONS以及-Dhttp*.proxy*设置。

如果您已经JAVA_OPTS做了

export JAVA_TOOL_OPTIONS=$JAVA_OPTS

答案 11 :(得分:0)

除了上面提到的技术,经过一些努力,您可以使用jproxyloader库通过代理运行maven(页面上有示例如何执行此操作:http://jproxyloader.sourceforge.net/)。这允许仅为下载工件设置socks代理。

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

答案 12 :(得分:0)

上述帖子有助于解决我的问题。除了上述内容之外,我还必须进行以下更改才能使其正常工作:

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

如果您不熟悉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
希望这会有所帮助!

答案 15 :(得分:0)

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

要遵循Don't repeat yourself principle(旨在帮助您避免错误),如果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缓存:"resolution will not be reattempted"

    mvn clean package --update-snapshots

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

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

结语

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

我已经明确解决了(转发HTTP / HTTPS)web proxy server的情况,该情况用于从公司网络内部(对于某些公司)访问Internet。这可能与SOCKS proxy明显不同,running your other Java applications inside a proxy也已在此处的一些答案中得到解决。

哦,因为它使用JAVA_TOOL_OPTIONS,所以该解决方案也可以应用于WSL


离别提示...上面的示例使用http://localhost:58080。这是因为我已经通过在remote-access客户端上使用Microsoft Terminal来运行从CLIENT_PROXY=localhost:58080到实际网络代理的端口转发:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY