中央仓库上传规则调整

2024 年6月11起sonatype 账户体系迁移,不再支持用户名密码模式,之前所有上传jar包到maven中央仓库教程都因此失效,需要替换为 accessToken 方式上传。

受影响用户:所有的需要在 maven 中央仓库发布jar包的 Java 开发者。

报错现象

6月11 日起, Shoulder 一直稳定运行的自动构建发布jar包能力失效,新版本发布失败401。

预期 提交代码后将自动通过 CICD 拉取代码,构建 jar 包并发布到 maven 仓库。

实际 401 发布失败。

报错摘要
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]

原因分析

401 代表 sonatype 在校验 jar 包签名、上传者身份时与预留信息不匹配,此时需要检查以下部分。

  1. 检查 pom.xml settings.xml 是否配置成功 (已检查提交记录,无变更)

  2. gpg --list-key 检查服务器公钥是否过期 (已检查,key永不过期,无问题)

  3. sonatype 账户体系迁移导致。【本文描述问题】

佐证

收到 Sonatype 官方团队邮件: sonatype账户系统迁移升级

邮件截图

解决方案(三步完成):

1. 打开 sonatype

打开 https://oss.sonatype.org/#welcome ,在右上角 Log In 登录账号。

nexus 生成Token

2. 生成 token

  1. 点击右上方用户名,点击 profile 打开个人信息

  2. 在下拉框,切换到 User Token,点击 Access User Token 并输入用户名、密码

nexus 生成Token
  1. 复制你的 User Token:这两个个文本框分别为最新toekn形式的 "userName", "password" ,你可以直接复制下方的xml配置

nexus 生成Token
xml
<server>
  <id>${server}</id>
  <username>leftShortToken</username>
  <password>Here is your right long token</password>
</server>

3. 修正 settings.xml

  1. 打开你的 settings.xml (一般在 C:\Users\Admin\.m2\settings.xml 或者 /home/UserName/.m2/settings.xml

  2. 修改 <servers> 内容:将刚刚复制的最新的 server 替换原来的配置(仅是 userName、passWord 变化,其余字段保持原有值)

  3. 保存退出

4. 重试发布,成功!

扩展阅读

扩展:Sonatype 最新账号创建方式

Sonatype 本次改动不仅影响老用户的使用,还影响第一次学习发布 jar 包到 maven 中央仓库的新用户(创建账号方式也发生变化),现有的博客或指南将失效。

建议直接参考官方最新一手信息:sonatype 2024.6最新账号创建方式(面向sonatype新用户)

扩展:上传 jar 包流程

上传 jar 包流程
  1. 开发者上传 jar 包至 Sonatype

  2. Sonatype 将 jar 包同步至 Maven中央仓库

  3. Maven镜像仓库 从 Maven中央仓库 拉取jar包

  4. 使用者从各类 maven 仓库获取 jar包

我们常说的如何发布jar包,一般指的是第一个流程。

扩展:自动发布jar包到中央仓库

Shoulder 开源项目:是 Spring Boot 的一套插件库,目标成为 Spring Boot 最好的伙伴。

自动发布jar包原理

Shoulder 使用了 Drone 作为 CICD 的服务器,整个流程是:

  1. git push 提交代码

  2. 代码仓库收到提交调用 Drone WebHook

  3. Drone 根据 .drone.yml 自动执行命令,自动构建 jar包,自动发布到远程仓库

最新 .drone.yml 脚本内容见 GiteeGithub

ShoulderSpring Boot 关系

  • Mybatis-plusMybatis

  • redissonredis

  • Slf4jLog

扩展: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镜像仓库与Maven中央仓库保持同步,它们通常由第三方机构或公司运营,如阿里云、华为云等提供的镜像服务。

举例
阿里云mvaen镜像仓库、腾讯云mvaen镜像仓库、华为云mvaen镜像仓库、清华大学mvaen镜像仓库...