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