执行Maven deploy时Nexus Releases仓库报401未授权,Snapshots正常
问题背景
在Sonatype Nexus Repository OSS 3.53.1-01中创建了3个私有仓库:
- browz-dev-releases:Maven Hosted类型,禁用重新部署
- browz-dev-snapshots:Maven Hosted类型,允许重新部署
- browz-dev-repos-group:仓库组,包含上述两个仓库及maven-public
使用Maven 3.9.1,全局及用户级settings.xml指向${MAVEN_HOME}/conf/settings.xml,已完成server认证、镜像、profile及激活配置,项目pom.xml也配置了distributionManagement。部署带-SNAPSHOT后缀的版本到browz-dev-snapshots仓库完全正常,但部署正式版本(移除-SNAPSHOT)到browz-dev-releases时,持续出现401未授权错误,且操作账号拥有nx-admin角色。
关键配置信息
settings.xml 中的Server认证配置
<server> <id>browz-dev-releases</id> <username>USER</username> <password>PASS</password> </server> <server> <id>browz-dev-snapshots</id> <username>USER</username> <password>pass</password> </server>
settings.xml 中的镜像配置
注释了默认的HTTP拦截镜像,添加全局镜像:
<!-- 已注释默认的http blocker --> <!-- <mirror> <id>maven-default-http-blocker</id> <mirrorOf>external:http:*</mirrorOf> <name>Pseudo repository to mirror external repositories initially using HTTP.</name> <url>http://0.0.0.0/</url> <blocked>true</blocked> </mirror> --> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/repository/browz-dev-repos-group/</url> </mirror>
settings.xml 中的Profile及激活配置
<profile> <id>nexus</id> <repositories> <repository> <id>central</id> <url>http://localhost:8081/repository/browz-dev-repos-group/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://localhost:8081/repository/browz-dev-repos-group/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </pluginRepository> </pluginRepositories> </profile> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles>
pom.xml 中的distributionManagement配置
<distributionManagement> <repository> <id>browz-dev-releases</id> <name>Dev Releases Repostiory</name> <url>http://localhost:8081/repository/browz-dev-releases/</url> </repository> <snapshotRepository> <id>browz-dev-snapshots</id> <name>Dev Snapshots Repostiory</name> <url>http://localhost:8081/repository/browz-dev-snapshots/</url> </snapshotRepository> </distributionManagement>
错误日志
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy(default-deploy)on project browz-framework: Failed to deploy artifacts: Could not transfer artifact com.browz:browz-framework:jar:1.0.0 from/to browz-dev-releases (http://localhost:8081/repository/browz-dev-releases/): Access denied to http://localhost:8081/repository/browz-dev-releases/com/brwoz/browz-framework/1.0.0/browz- framework-1.0.0.jar. Error code 401, Unauthorized[m ->[Help 1]
排查与解决步骤
核对密码大小写
注意到settings.xml中两个server的密码大小写不一致:browz-dev-releases用的是PASS(大写),browz-dev-snapshots用的是pass(小写)。Nexus的密码是大小写敏感的,先确认账号的实际密码,将两个server的密码统一为正确值后重试。检查Releases仓库的部署权限
即使账号拥有nx-admin角色,仍需确认browz-dev-releases仓库的权限配置:- 登录Nexus控制台,找到
browz-dev-releases仓库,进入「Settings」标签; - 确认「Deployment Policy」的设置:禁用重新部署仅限制覆盖已存在的版本,不影响部署新的正式版本;
- 进入「Permissions」标签,确认nx-admin角色拥有该仓库的
nx-repository-view-maven2-browz-dev-releases-deploy权限(部署权限)。
- 登录Nexus控制台,找到
临时禁用全局镜像测试
你配置了<mirrorOf>*</mirrorOf>的全局镜像,虽然理论上不会影响distributionManagement指定的独立仓库部署,但可临时注释该镜像配置,重新执行deploy命令,排查是否是镜像规则干扰了认证流程。清理Maven本地缓存
Maven可能缓存了旧的认证信息,执行以下命令清理缓存并重新构建:mvn clean install -U之后再执行
mvn deploy尝试部署正式版本。查看Nexus详细日志
登录Nexus服务器,查看sonatype-work/nexus3/log/nexus.log,找到对应401错误的日志条目,里面会明确说明是认证失败还是权限不足,这是最直接的排查依据。
内容的提问来源于stack exchange,提问作者userDT

