1. 简介
本文将介绍如何在代理(Proxy)环境下配置 Maven,这在企业内网等无法直连外网的场景中非常常见。
以实际环境为例:我们的代理服务器运行在 proxy.baeldung.com
,监听 HTTP 协议的 80 端口。同时,我们还需要访问一些内部系统,例如 internal.baeldung.com
,这些地址不需要走代理,必须直连。
目标很明确:✅ 外网走代理,✅ 内网直连,✅ 密码加密,避免敏感信息泄露。
2. 基础代理配置
首先,我们配置一个不带认证的代理。核心是修改 Maven 的 settings.xml
文件,通常位于用户目录下的 ~/.m2/settings.xml
。如果不存在,可以从 Maven 安装目录的 conf/settings.xml
拷贝一份。
在 <proxies>
节点下添加代理配置:
<proxies>
<proxy>
<host>proxy.baeldung.com</host>
<port>80</port>
</proxy>
</proxies>
接着,通过 <nonProxyHosts>
指定不需要代理的地址。使用 |
分隔多个规则:
<nonProxyHosts>internal.baeldung.com|localhost|127.*|[::1]</nonProxyHosts>
⚠️ 注意:nonProxyHosts
是正则匹配,127.*
能覆盖所有本地回环地址,推荐保留。
3. 添加认证信息
大多数企业代理是需要用户名密码的。直接在 <proxy>
中添加即可:
<username>baeldung</username>
<password>changeme</password>
✅ 关键点:只有需要认证时才加用户名密码,否则可能反而导致请求被拒绝。空字段也别留!
最终的最小化认证配置如下:
<proxies>
<proxy>
<host>proxy.baeldung.com</host>
<port>80</port>
<username>baeldung</username>
<password>changeme</password>
<nonProxyHosts>internal.baeldung.com|localhost|127.*|[::1]</nonProxyHosts>
</proxy>
</proxies>
配置完成后,执行 mvn compile
等命令时,Maven 就会自动通过代理拉取依赖。
3.1 可选配置项
为了便于管理多个代理,可以添加以下可选字段:
<id>
:给代理命名,比如BaeldungProxy_Authenticated
,方便切换。<active>
:控制是否启用,默认true
。多个代理时,Maven 只会使用第一个 active 为 true 的配置。<protocol>
:默认是http
,如果代理使用 HTTPS 或其他协议,需显式指定。
完整配置示例:
<proxies>
<proxy>
<id>BaeldungProxy_Authenticated</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.baeldung.com</host>
<port>80</port>
<username>baeldung</username>
<password>changeme</password>
<nonProxyHosts>internal.baeldung.com|localhost|127.*|[::1]</nonProxyHosts>
</proxy>
</proxies>
⚠️ 踩坑提醒:<protocol>
指的是代理协议,不是你请求的 URL 协议(如 https://),别搞混了。
4. 安全加固:加密配置
直接把密码写在 settings.xml
里显然不安全,尤其要分享配置时。Maven 提供了密码加密机制,基于主密码(Master Password)加密子密码。
4.1 生成主密码
选择一个强密码,比如 te!st!ma$ter
,然后执行:
mvn --encrypt-master-password
Master Password:
输入后得到加密字符串(示例):
{QFMlh/6WjF8H9po9UDo0Nv18e527jqWb6mUgIB798n4=}
4.2 常见问题处理
如果命令行不弹出 Master Password:
提示(常见于 bash 环境),直接在命令后接密码:
Linux/macOS(bash):
mvn --encrypt-master-password 'te!st!ma$ter'
Windows:
mvn --encrypt-master-password "te!st!ma$ter"
⚠️ 如果生成的加密串包含 }
(如 {...UD}0Nv...}
),Maven 会解析失败。解决方案:
- 重新生成,直到不含花括号
- 或手动转义:在
}
前加反斜杠\
4.3 创建 settings-security.xml
在 ~/.m2/
目录下创建 settings-security.xml
,内容如下:
<settingsSecurity>
<master>{QFMlh/6WjF8H9po9UD\}0Nv18e527jqWb6mUgIB798n4=}</master>
</settingsSecurity>
你也可以加注释(但别包含 {
或 }
):
<master>We escaped the curly brace with '\' {QFMlh/6WjF8H9po9UD\}0Nv18e527jqWb6mUgIB798n4=}</master>
4.4 主密码外置(高安全场景)
若需更高安全性,可将 settings-security.xml
放在 U 盘等外部设备上,比如:
R:\config\settings-security.xml
然后在本地 ~/.m2/settings-security.xml
中设置重定向:
<settingsSecurity>
<relocation>R:\config\settings-security.xml</relocation>
</settingsSecurity>
✅ Maven 会自动从指定路径读取主密码,拔掉 U 盘即无法解密,简单粗暴有效。
5. 加密代理密码
有了主密码,现在加密代理密码。执行:
mvn --encrypt-password
Password:
输入 changeme
,得到加密结果(示例):
{U2iMf+7aJXQHRquuQq6MX+n7GOeh97zB9/4e7kkEQYs=}
最后,替换 settings.xml
中的明文密码:
<proxies>
<proxy>
<id>BaeldungProxy_Encrypted</id>
<host>proxy.baeldung.com</host>
<port>80</port>
<username>baeldung</username>
<password>{U2iMf+7aJXQHRquuQq6MX+n7GOeh97zB9/4e7kkEQYs=}</password>
</proxy>
</proxies>
保存后,Maven 会自动解密并使用该密码,配置文件可放心分享。
6. 使用系统属性配置(替代方案)
虽然推荐用 settings.xml
,但也可以通过 JVM 系统属性配置代理,适用于临时调试或 CI 环境。
6.1 启用系统代理
-Djava.net.useSystemProxies=true
⚠️ 注意:不是所有 Maven 插件都支持该设置,稳定性不如 settings.xml
。
6.2 手动指定代理参数
代理主机:
-Dhttp.proxyHost=proxy.baeldung.com
代理端口(非 80 时):
-Dhttp.proxyPort=8080
不走代理的地址:
-Dhttp.nonProxyHosts="internal.baeldung.com|localhost|127.*|[::1]"
认证信息(如需):
-Dhttp.proxyUser=baeldung -Dhttp.proxyPassword=changeme
6.3 永久生效(MAVEN_OPTS)
将常用参数写入环境变量,避免每次输入:
export MAVEN_OPTS="-Dhttp.proxyHost=10.10.0.100 -Dhttp.proxyPort=8080"
Windows:
set MAVEN_OPTS= -Dhttp.proxyHost=10.10.0.100 -Dhttp.proxyPort=8080
✅ 优点:全局生效。
❌ 缺点:密码仍为明文,不适合高安全场景。
7. 总结
本文覆盖了 Maven 代理配置的完整链路:
- 基础代理配置 ✅
- 认证支持 ✅
- 密码加密(主密码 + 代理密码)✅
- 主密码外置(U 盘)✅
- 系统属性替代方案 ✅
现在你可以放心地把 settings.xml
发给同事,只需让他们配置自己的主密码即可,敏感信息零泄露。
示例代码已上传至 GitHub:https://github.com/eugenp/tutorials/tree/master/maven-modules/maven-proxy