Jenkins执行mvn deploy调用凭证部署至Nexus失败排查
咱们先理清楚你的情况:你已经在Jenkins的Config File Management里配置了对应Nexus凭证的Maven settings.xml,pom的distributionManagement也用了相同的server ID,但部署时触发403 Forbidden,本地跑mvn -X deploy还弹出找不到settings-security.xml的解密警告(但你明明用的是明文密码)。下面分两部分帮你解决:
一、先搞定本地的解密警告(非核心,但消除干扰)
那个解密警告是Maven的默认行为——哪怕你用明文密码,它也会尝试去读settings-security.xml找解密密钥。你要么忽略这个警告,要么直接在~/.m2/目录下建一个空的settings-security.xml,内容就一行:
<settingsSecurity/>
这样调试日志里就不会再出现这个报错了,不影响实际部署。
二、重点解决Jenkins部署的Forbidden错误
1. 确认Jenkins的settings.xml是否正确生效
你说已经在任务里引入了配置,但得仔细检查:
- 在Jenkins任务的构建步骤(Maven构建)里,有没有勾选「Use Maven Settings from Configuration File Provider」,并选中你创建的那个settings配置?
- 可以在Jenkins构建里加个临时步骤,打印实际使用的settings.xml内容(比如加Shell步骤:
cat $MAVEN_SETTINGS_PATH,这个变量是Config File Provider插件自动生成的),确认里面的server ID、用户名、密码都和你配置的一致,没有乱码或转义问题。
2. 排查Nexus的权限与地址问题
Forbidden大概率是权限或路径错了:
- 先验证Nexus账号权限:用你配置的账号手动登录Nexus,尝试上传一个测试文件到目标仓库,确认它有Deploy权限(release仓库要Deploy权限,snapshot仓库要Snapshot Deploy权限)。
- 检查pom里的仓库URL:
http://nexus.mycompany.com是不是完整的仓库路径?比如Nexus的仓库地址一般是http://nexus.mycompany.com/repository/xxx-release/这种具体路径,只写域名的话Nexus会拒绝访问,返回403。
3. 确认Jenkins节点的网络连通性
如果Jenkins用的是代理节点跑构建,要确保这个节点能正常访问Nexus:
- 加个Shell步骤测试:
curl -I http://nexus.mycompany.com/repository/xxx-release/,看能不能返回200状态码;或者telnet nexus.mycompany.com 80(根据Nexus实际端口调整),确认网络没被防火墙/代理拦截。
4. 检查Maven命令的参数
确保Jenkins执行的Maven命令是用了你配置的settings文件,要么是插件自动帮你指定了-s参数,要么你手动加上:
mvn clean deploy -s $MAVEN_SETTINGS_PATH
避免Maven用默认的settings.xml导致凭证没生效。
5. 验证Jenkins凭证的正确性
你在Config File Management里选的凭证是不是用户名+密码类型?有没有可能密码里有特殊字符(比如$、!)被Jenkins转义了?可以尝试重新创建凭证,或者把密码复制到本地settings.xml里测试部署,确认密码本身没问题。
快速验证流程
- 本地用和Jenkins配置完全一致的settings.xml执行
mvn clean deploy,确认能成功部署,排除项目本身的问题。 - 在Jenkins里加测试步骤:
curl -u 用户名:密码 http://nexus.mycompany.com/repository/xxx-release/,看能不能正常访问仓库,验证凭证和权限。
内容的提问来源于stack exchange,提问作者Glory to Russia

