Maven的settings.xml中server密码应加密存储:先用mvn --encrypt-master-password生成主密码写入settings-security.xml,再用mvn --encrypt-password加密实际密码;server的id必须与pom.xml中distributionManagement的repository id完全一致(区分大小写、无空格);密码含特殊字符需URL编码;servers不随profile激活而变化,全局生效。

settings.xml 里 <server> 的账号密码明文问题
直接写在 settings.xml 里的 username 和 password 是明文,不安全,尤其当配置被提交到共享仓库或多人共用机器时。Maven 本身不加密存储,但支持通过 mvn --encrypt-password 生成加密串,再配合 settings-security.xml 解密——前提是本地已配好主密码。
- 必须先在本地生成主密码:
mvn --encrypt-master-password your_master_pass,结果粘贴进${user.home}/.m2/settings-security.xml的<master>标签内 - 再用
mvn --encrypt-password your_server_pass加密实际密码,填入<server>的<password> - 如果跳过主密码步骤,Maven 启动时会静默忽略加密密码,回退到未认证状态,且不报错
Server ID 必须和 pom.xml 或命令行中的 serverId 完全一致
Maven 不靠 URL 匹配服务器,只认 <id> 字符串。哪怕 settings.xml 里写了正确的账号密码,只要 <id> 和 <distributionManagement> 里的 <repository> 的 id 属性、或 -DaltDeploymentRepository 指定的 ID 对不上,认证就失效。
-
pom.xml中:<repository><id>my-nexus</id></repository> - 对应
settings.xml必须是:<server><id>my-nexus</id><username>...</username></server> - ID 区分大小写,空格也不允许;常见错误是
nexus-repo和nexus_repo混用
HTTPS 仓库用 Basic Auth 时,密码含特殊字符要 URL 编码
某些私有 Nexus/Artifactory 实例开启 Basic 认证后,若密码含 @、/、: 等字符,Maven 内部拼接 HTTP Authorization 头时可能解析失败,导致 401。这不是 settings.xml 配置错误,而是传输层解析问题。
- 临时验证方式:用
curl -u user:pass https://repo.example.com/repository/maven-releases/手动测通 - 若 curl 也失败,说明密码需编码;可用 Python 快速处理:
import urllib.parse; print(urllib.parse.quote('p@ss/w0rd')) - 编码后的字符串直接填入
<password>,Maven 会原样传给服务端
多 profile 场景下,<server> 不继承、不覆盖
settings.xml 的 <servers> 是扁平结构,不按 profile 划分。即使你激活了某个 profile,其中定义的 <server> 也不会自动生效——profile 只影响 <profiles> 和 <activeProfiles>,跟 <servers> 无关。
- 所有
<server>在 Maven 启动时一次性加载,全局可见 - 不同环境(dev/staging/prod)共用同一套 server 配置时,容易因 ID 冲突或密码混淆导致部署错库
- 更稳妥的做法:用不同 ID 隔离,比如
nexus-dev、nexus-prod,并在对应 profile 的<distributionManagement>中显式指定
mvn deploy -X 看 debug 日志里有没有 “Using authentication from server …” 这行输出。










