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


原始标题:Using Maven Behind a Proxy