Maven Central Publishing
准确来说,这篇文章简要介绍一下使用 Gradle 以及 GitHub Actions 来把 相对简单的 [1] Java 项目打包发布到 Maven Central 上的流程。
域名认证¶
请跟随 这里的教程 认证自己 Java package 所用到的域名。基本上:
在 Sonatype 的 JIRA 系统上注册一个账号。
-
在 OSSRH [2] 中创建一个 Issue (登录后,用教程里的 这个链接 )。
-
之后跟随 Bot 即可。如果你拥有此域名,那么你需要设置一个 TXT 记录; 如果你用的是
io.github.*
之类的,那你需要新建一个 Repo。Add a DNS TXT record to your domain with the text: OSSRH-<你的 Issue 编号>.
Please read https://central.sonatype.org/faq/how-to-set-txt-record/ Edit this ticket and set Status to Open.
里面的
OSSRH-<你的 Issue 编号>
例如是OSSRH-78049
,Bot 都会给出来。
-
-
教程上说需要 less than 2 business days ,我的经历是:
Created: 02/09/22 04:31 PM
Resolved: 02/09/22 04:47 PM
(大概都是 Bot 自动化了。)
总之等待一封把 Issue 标为 Resolved 的邮件,随后就可以进行下一步了。
Open Source Project Repository Hosting
Gradle Setup¶
样例放在这里 Reactor Locks ,是个很小的库,比较适合用作演示。使用的 Gradle 版本为 6.8 。 未说明的话,下面的文件都放在项目根目录下。
添加 Gradle 插件¶
在 build.gradle 开头的 plugins 里添加 maven-publish
和 signing
:
没有 sourceCompatibility
或 targetCompatibility
的请添加上。
Javadoc 配置¶
Maven Central 强制要求项目提供 Javadoc。
我们将 Gradle 配置分成几个文件,在 build.gradle
最后添加:
接下来编辑 javadoc.gradle
,我直接抄了 Reactor Core 的写法,这里就不复制粘贴上来了( 抄的内容如链接所示 )。 改完了用 ./gradlew javadoc
或者 ./gradlew javadoc
测试一下。有报错先改过来。
Publishing 配置¶
配置文件¶
同样, build.gradle
最后添加 publish.gradle
,然后可以参考 这里的写法 把项目相关信息全部填上。
GPG 密钥¶
不介绍太多,可参考 Working with PGP Signatures 。
你需要:
安装 GPG。
使用
gpg --gen-key
命令生成一个密钥对。-
找到生成的密钥对的 keyid 。可用
gpg --list-keys <密钥对应的邮箱>
命令查看,例如:$ gpg --list-keys 'central@example.com' pub rsa3072 2021-06-23 [SC] [expires: 2023-06-23] CA925CD6C9E8D064FF05B4728190C4130ABA0F98 uid [ultimate] Central Repo Test <central@example.com> sub rsa3072 2021-06-23 [E] [expires: 2023-06-23]
里面的例如
CA925CD6C9E8D064FF05B4728190C4130ABA0F98
这一串就是 keyid 。 -
将公钥上传到 key server:
在使用 GitHub Actions 时我们需要导出私钥,这里先不介绍。
GitHub Actions 配置¶
可参考 这里的 build.yml ,需要更改的地方是 JDK 的版本( java-version:
一行)。
注意我们这里用到了 environment: 'Maven Publishing'
,环境名需要严格对应之后创建的 Environment。 另外,此实例配置将 Actions 限制到了 release
分支上,并且只能手动到 Actions 里 Run workflow。
创建 Environment¶
到 GitHub 项目的 Settings -> Environments -> New environment
输入上面的环境名。
创建后,在 Deployment branches
里让环境可以并仅可应用于 release
分支。
随后我们要向环境里添加 MAVEN_USERNAME
MAVEN_PASSWORD
SIGNING_KEY_ID
SIGNING_PASSPHRASE
SIGNING_SECRET_KEY
这五个环境变量。
前两个的话,请在 https://s01.oss.sonatype.org (或是其它网址,如果仓库又迁移了的话)登录。 右上角用户名点开,从 Profile 里进到 User Token 界面。点击 Access User Token
创建新的 Token, 把用户名(短的一串?)作为 MAVEN_USERNAME
添加到环境中,长的一串 MAVEN_PASSWORD
。
后三个的话,还记得 GPG 的 keyid 吗? SIGNING_KEY_ID
是 keyid 的 后八位 , 例如 CA925CD6C9E8D064FF05B4728190C4130ABA0F98
是 0ABA0F98
。 SIGNING_PASSPHRASE
如果在生成密钥时指定了 pass phrase 的话请填进去。
SIGNING_SECRET_KEY
需要导出。使用命令:
$ gpg --export-secret-keys --armor CA925CD6C9E8D064FF05B4728190C4130ABA0F98 -----BEGIN PGP PRIVATE KEY BLOCK----- 1234567890Abc... ... -----END PGP PRIVATE KEY BLOCK-----
请把 CA925CD6C9E8D064FF05B4728190C4130ABA0F98
换为对应的 keyid ,将输出的从 -----BEGIN PGP PRIVATE KEY BLOCK-----
到 -----END PGP PRIVATE KEY BLOCK-----
(包括) 复制,作为 SIGNING_SECRET_KEY
。
测试¶
把项目 build.gradle
里的 version
设为 SNAPSHOT(即 0.1.0-SNAPSHOT
诸如此类,只需以 -SNAPSHOT
结尾均可)。 Push 到 release
分支上,到 GitHub 项目上的 Actions 页面。 All workflows -> Build and Publish 然后 Run workflow 选择 Branch: release ,点 Run workflow 。
正式发布¶
同上。 Push 到 release
分支上,到 GitHub 项目上的 Actions 页面。 All workflows -> Build and Publish 然后 Run workflow 选择 Branch: release ,点 Run workflow 。
但是,在 Workflow 跑完之后,我们还需要到 https://s01.oss.sonatype.org (或是其它网址,如果仓库又迁移了的话) 里面去 Close 然后 Release。
This work is licensed under Creative Commons Attribution-ShareAlike 4.0 International
评论