Maven 2024年3月大改版后,我该如何把自己的jar包发布到中央仓库?
Maven 2024年3月大改版后,我该如何把自己的jar包发布到中央仓库?
简介
如果你想让自己编写的java库可以被别人使用,你应该把它打包成jar并上传至Maven中央仓库,这样其他人就可以通过一个gav坐标引用你的库了,就像下面这样:
<dependency>
<groupId>com.baizhukui</groupId>
<artifactId>warmup-springboot3-starter</artifactId>
<version>1.0.1</version>
</dependency>
网上的教程数不胜数,但当我实操时却遇到了种种困难,我查阅Maven中央仓库官方文档后,发现 Maven 在2024年3月作出了巨大的改变(详见以下引文),网上的教程(尤其是中文互联网)大多都在介绍基于 OSSRH 的旧方法,我决定写一篇博客为有类似需求的朋友节省时间。
From March 12th, 2024, all registration will be via the Central Portal. For information about legacy registration, please see the relevant documentation. For support with switching to publish via the legacy OSSRH publishing method during Portal Early Access, please see the section below.
注册Maven中央仓库账号
访问Maven中央仓库,并注册账号,通过google等第三方登录或使用账号密码注册都可以(如果你执意要使用基于 OSSRH 的旧方法,请使用账号密码注册)
添加一个命名空间
登录后,点击“publish”
在发布jar包之前,你需要绑定一个命名空间,这其实就是gav坐标中的“groupId”,必须是你持有域名的倒序写法,例如com.baizhukui。
你需要证明你对这个域名的所有权,Maven会要求你将一条TXT类型的解析记录添加到你的域名的DNS记录中。
说起解析记录,你可能更熟悉A(将域名指向一个ip地址)和CNAME(将域名指向另一个域名)。TXT也是一种解析记录,你可以在你域名提供商(如阿里云、cloudflare)的DNS控制台上完成此操作。
添加完以后,告诉Maven验证该记录的存在,验证通过后即可证明你对这个域名的所有权。
获取token
发布jar所使用的登录凭证和你的账号密码是分开的,逻辑类似github token,你需要通过以下步骤获取。
你会得到一短一长的两个东西,短的将作为推送jar时的“username”,长的将作为“password”。
将token信息添加到你的Maven配置文件(Maven安装目录下的settings.xml)中的servers标签下。
<server>
<id>central</id>
<username>xxxxxx</username>
<password>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</password>
</server>
注意,这个id要和后续pom.xml中填写的publishingServerId一致,这里我们都用central。
完善项目的pom.xml
要推送到Maven仓库供他人使用的项目和咱们本地跑的crud项目不一样,pom里要填写一些项目相关的信息和必要的插件。具体详见官方文档。
可以借鉴我的再根据需要改一下:https://github.com/songxychn/warmup-springboot3-starter/blob/main/pom.xml
除了properties、dependencyManagement、dependencies是根据项目需求填的个性化配置以外,剩下的都是必填项。
GPG
看了我的pom.xml后,你会发现一个名为maven-gpg-plugin的插件,这涉及到一个必要的软件:GPG。
在向 Maven 中央仓库推送 jar 包的过程中,GPG(GNU Privacy Guard)的作用是提供一种安全机制,确保你的 jar 包在传输过程中没有被篡改,并且确认是你本人发布的。GPG 通过为你的 jar 包生成数字签名来实现这一点。当其他开发者下载你的 jar 包时,他们可以使用你的公钥来验证这个签名,以确保 jar 包的完整性和来源的真实性。
你可以在GPG官网下载GPG,安装完成后,使用gpg --gen-key
命令生成一个密钥,你要为这个密钥指定一个密码,请记住这个密码,后续要用到。
你将会得到一个类似于 CA925CD6C9E8D064FF05B4728190C4130ABA0F98 的东西,这是你密钥的id。
你还需要把这个密钥发布到一个公共密钥服务器,命令如下:
gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
如果失败了,可以尝试把keyserver.ubuntu.com替换为:
你还需要把你刚才为密钥指定的密码添加到你本地Maven配置文件的servers标签下,如下所示:
<server>
<id>gpg.passphrase</id>
<passphrase>xxxxxxxxxxx</passphrase>
</server>
发布jar包
运行deploy命令即可
你可能要等待几分钟,因为Maven中央仓库要对你发布的内容做一个简单的校验。
在执行成功后,登录Maven中央仓库官网,你就可以看到一个deployment,几分钟后这个jar就可以被下载到了。
使用Github Action自动化发布流程
你可以使用Github Action实现在每次发布新的release时自动发布jar包到Maven中央仓库。配置文件示例如下:
请把该yml文件放置在项目的.github/workflows
目录下,以便被github识别。
name: Publish package to the Maven Central Repository
on:
release:
types: [created]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
# 选择你喜欢的jdk发行版,仅用于github action的运行环境
distribution: 'temurin'
java-package: 'jdk'
# 填写你jar的jdk版本
java-version: '21'
check-latest: true
# 和你在settings.xml、pom.xml中填写的server id保持一致
server-id: 'central'
server-username: OSSRH_USERNAME
server-password: OSSRH_PASSWORD
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg-passphrase: SIGN_KEY_PASS
cache: 'maven'
- name: Build & Deploy
run: |
# -U force updates just to make sure we are using latest dependencies
# -B Batch mode (do not ask for user input), just in case
# -P activate profile
mvn -U -B clean deploy -P release
env:
SIGN_KEY_PASS: ${{ secrets.GPG_PASSPHRASE }}
OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
这里使用到了四个secrets变量,他们分别是:
- GPG_PRIVATE_KEY:你的gpg密钥,一个以“-----BEGIN PGP PRIVATE KEY BLOCK-----”开始,“-----END PGP PRIVATE KEY BLOCK-----”结束的字符串。你可以通过
gpg --export-secret-keys --armor CA925CD6C9E8D064FF05B4728190C4130ABA0F98(替换为你的密钥id)
将你的密钥以这个形式导出,需要输入你之前为密钥指定的密码。 - GPG_PASSPHRASE:你之前为密钥指定的密码
- OSSRH_USERNAME:你在Maven中央仓库官网生成的token中短的那个
- OSSRH_PASSWORD:你在Maven中央仓库官网生成的token中长的那个
如下图所示告诉github这四个secret:
如下图所示发布一个release,以触发打包发布流程:
如果 action 成功结束(如下图所示),说明你成功地使用github action自动化地发布了一次jar包!
总结
本文介绍了在2024年3月Maven中央仓库改版之后,如何发布自己的jar包。还介绍了如何使用github action自动化发布流程。