目录
- 目录
- 背景:
- 报错现象
- 一句话解决
- 一句话原因
- 问题描述
- 前车之鉴:尝试无果的记录
- 尝试1:询问 GPT 未果
- 尝试2:搜索引擎未果
- 正确原因分析:
- 佐证
- 解决方案(三步完成):
- 1. 打开 sonatype
- 2. 生成 token
- 3. 修正 settings.xml
- 重试发布,成功!
- 扩展阅读
- 扩展:Sonatype 最新账号创建方式
- 扩展:上传 jar 包流程
- 扩展:自动发布jar包到中央仓库
- 自动发布jar包原理
- Shoulder 简介
- 扩展:Sonatype、中央仓库关系
- Sonatype
- Maven中央仓库
- Maven镜像仓库
背景:
2024 年6月11起,sonatype 账户体系迁移,不再支持用户名密码模式,之前所有上传jar包到maven中央仓库教程都因此失效,咨询多个 GPT、搜索均无正确答案。
受影响用户:所有的需要在
maven
中央仓库发布jar包的Java
开发者。
本文记录问题时间线,解决方案,节省更多人时间。
报错现象
status code: 401, reason phrase: Content access is protected by token (401)
报错详情:
[ERROR] Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin:1.6.13:deploy (injected-nexus-deploy) on project shoulder-archetype-simple: Remote staging failed: Failed to deploy artifacts: Could not transfer artifact cn.itlym:shoulder-starters:pom.asc:0.8.1 from/to oss (https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/cnitlym-1116): status code: 401, reason phrase: Content access is protected by token (401) -> [Help 1]
一句话解决
把 settings.xml
的 userName、password 更换为 sonatype 生成的 token。
一句话原因
sonatype 认证体系升级,官宣不再支持 userName、password 认证方式,导致按照老旧上传方式上传jar
失败。
问题描述
6月11 日起, Shoulder 一直稳定运行的自动构建发布jar包能力失效,新版本发布失败401。
预期 提交代码后将自动通过 CICD
拉取代码,构建 jar 包并发布到 maven 仓库。
实际 401 发布失败。
前车之鉴:尝试无果的记录
避免重复踩坑,可跳过阅读
尝试1:询问 GPT 未果
你是资深的java专家,精通Java、maven,有着多年发布 jar 包的经验,现在发布jar包(mvn deploy)阶段遇到了以下报错,你来分析下是什么原因
[报错信息…]
GPT 回复(无效回答):
这个报错是因为在发布jar包时,遇到了权限问题。具体来说,是在使用nexus-staging-maven-plugin插件进行远程部署时,没有提供正确的访问令牌(token),导致服务器返回了401错误。
要解决这个问题,你需要在Maven的settings.xml文件中配置正确的访问令牌。请按照以下步骤操作:
打开Maven的settings.xml文件,通常位于用户目录下的.m2文件夹中。
在标签内添加一个元素,配置如下:
<servers>
<server>
<id>oss.sonatype.org</id>
<username>your_sonatype_username</username>
<password>your_sonatype_password</password>
</server>
</servers>
解释
将your_sonatype_username和your_sonatype_password替换为你的Sonatype账户的用户名和密码。
保存settings.xml文件并重新运行mvn deploy命令。
这样应该可以解决你遇到的问题。如果还有其他问题,请随时告诉我。
尝试2:搜索引擎未果
几乎都是指导如何上传jar包,401 的解决方案都是老旧问题,而该问题是 2024年6月官方升级引入,目前无正确解决方案。
正确原因分析:
401 代表 sonatype 在校验 jar
包签名、上传者身份时与预留信息不匹配,此时需要检查以下部分。
- 检查
pom.xml
settings.xml
是否配置成功 (已检查提交记录,无变更) gpg --list-key
检查服务器公钥是否过期 (已检查,key永不过期,无问题)- sonatype 账户体系迁移导致。【本文描述问题】
佐证
收到 Sonatype
官方团队邮件:sonatype 用户体系迁移公告
解决方案(三步完成):
Sonatype 官方提供的新认证方案链接
1. 打开 sonatype
https://oss.sonatype.org/#welcome ,在右上角 Log In
登录你的账号。
2. 生成 token
- 点击右上方用户名,点击 profile 打开个人信息
- 在下拉框,切换到 User Token,点击 Access User Token 并输入用户名、密码
- 复制 User Token:这两个文本框分别为最新toekn形式的 “userName”, “password” ,这里你可以直接复制下方的xml配置
<server>
<id>${server}</id>
<username>leftShortToken</username>
<password>Here is your right long token</password>
</server>
3. 修正 settings.xml
- 打开你的 settings.xml (一般在
C:\Users\Admin\.m2\settings.xml
或者/home/UserName/.m2/settings.xml
) - 修改
<servers>
内容:将刚刚复制的最新的server
替换原来的配置(仅是 userName、passWord 变化,其余字段保持原有值) - 保存退出
重试发布,成功!
扩展阅读
扩展:Sonatype 最新账号创建方式
Sonatype 本次改动不仅影响老用户的使用,还影响第一次学习发布 jar 包到 maven 中央仓库的新用户(创建账号方式也发生变化),现有的博客或指南将失效。
建议直接参考官方最新一手信息:sonatype 2024.6最新账号创建方式(面向sonatype新用户)
扩展:上传 jar 包流程
- 开发者上传 jar 包至 Sonatype
- Sonatype 将 jar 包同步至 Maven中央仓库
- Maven镜像仓库 从 Maven中央仓库 拉取jar包
- 使用者从各类 maven 仓库获取 jar包
我们常说的如何发布jar包,一般指的是第一个流程。
扩展:自动发布jar包到中央仓库
Shoulder
开源项目:是 Spring Boot
的一套插件库,目标是成为 Spring Boot
最好的伙伴。
自动发布jar包原理
Shoulder 使用了 Drone
作为 CICD 的服务器,整个流程是:
- git push 提交代码
- 代码仓库收到提交调用
Drone
WebHook - Drone 根据
.drone.yml
自动执行命令,自动构建 jar包,自动发布到远程仓库
最新 .drone.yml
脚本内容见 Gitee 或 Github
Shoulder 简介
Shoulder
和 Spring Boot
关系
- 如
Mybatis-plus
和Mybatis
- 如
redisson
和redis
- 如
Slf4j
和Log
更多: Shoulder-官方文档
扩展:Sonatype、中央仓库关系
Sonatype
身份:Sonatype是一个提供软件生命周期管理解决方案的公司,它提供了一个名为Nexus Repository Manager
的仓库管理器,用于存储和管理软件构件(jar 包)。
关系:Sonatype运营着Maven中央仓库,并提供对其进行管理和维护的服务。
所以发布jar包必须注册 Sonatype 账号并在 Sonatype 发布 jar,然后 Sonatype 帮你发布到 maven 中央仓库。
Maven中央仓库
身份:Maven中央仓库是Java世界中最大的开源软件仓库,存放着大量的Java库和框架的jar包。
关系:Maven中央仓库由Sonatype维护,开发者可以通过Maven工具访问该仓库,下载或上传构件。
几乎所有公开的 jar 包都在此托管
Maven镜像仓库
身份:Maven镜像仓库是Maven中央仓库的镜像,它们复制了中央仓库的内容,以提供更快的访问速度和降低原始仓库的负载。
关系:Maven镜像仓库与Maven中央仓库保持同步,它们通常由第三方机构或公司运营,如阿里云、华为云等提供的镜像服务。
举例:阿里云mvaen镜像仓库、腾讯云mvaen镜像仓库、华为云mvaen镜像仓库、清华大学mvaen镜像仓库…