发布至MavenCentral
流程概览
要将库发布至 MavenCentral 一般需要以下几个步骤:
- 注册 Sonatype 账号,
- 创建 Jira 工单用于开通发布权限,
- 使用自有域名或者
io.github
, - 验证域名或 Github 归属
- 使用自有域名或者
- 使用 GPG 创建密钥用于对发布的库进行签名
- 使用 Gradle 发布至 S01,
- 同步至 MavenCentral
以上就是将库发布至 MavenCentral 的一般步骤,下面根据流程一步步开始吧。
注册账号
首先访问以下地址去注册一个 Sonatype 账号:
https://issues.sonatype.org/secure/Dashboard.jspa
注册完成后再登录即可进入 System Dashboard 界面。
现在点击顶部工具栏上的 Create/新建 按钮创建一个工单:
这个工单虽然看上去要填很多项内容,但其实还是非常简单的:
我们只需要填写带星号的必填项即可。
- Project 和 Issue Type 保持默认选项,不用做修改,
- Summary 可以随便填,这里我填写的是项目名称,
- Group Id 非常重要,决定着库的包路径是什么,
- 使用自有域名的倒排方式,建议使用一级域名,后续可以使用二级域名。比如:一级域名是
com.abc
,二级域名随意:com.abc.def
等。注意:域名仅验证一次,后续可以不再续费域名, - 使用 Github 的域名:
io.github.[githubUsername]
, - 这里我使用自有域名:
com.sunxiaodou
- 使用自有域名的倒排方式,建议使用一级域名,后续可以使用二级域名。比如:一级域名是
- Project URL 填写该项目的 Github 地址,
- SCM url 只需要在上面的 Github 地址后面加上
.git
后缀即可。
点击 Create/新建 完成工单创建。
创建完工单之后需要等待工作人员审核,工作时间审核较快。如果你是在周末创建的工单,那么可能需要等待两到三天的时间才会有人处理。
有工作人员处理你的工单之后,他会在你的工单里留下一条评论,如下图所示:
这条评论的意思就是,你要证明刚才你在 Group Id 里填写的包路径所对应的域名是你的。
证明的方式就是,在你的域名中添加一条类型为 TXT 的解析,并将它指向你这条工单的 URL 地址:
如果是使用的 Github,需要在 Github 上创建一个名为
OSSRH-96095
的公开仓库以验证 Github 账号的所属。
添加完解析记录(Github 仓库已创建)后,你需要在工单里回复一下,可以直接简单评论一句 Done 即可。这样工作人员会去验证你添加的解析记录是否已生效(Github 仓库是否已创建),验证没有问题之后,将会在评论里告诉你申请已通过:
从评论里得知,我们现在已经有权限向 s01.oss.sonatype.org
这个地址发布库了。
创建密钥
MavenCentral 还要求,所有发布的库都必须使用 GPG 来进行签名才行,所以接下来我们就进行这个操作。
GPG 在一些 Linux 系统上是内置的,如果你使用的 Linux 系统没有内置的话可以通过以下命令进行安装:
sudo apt install gnupg
Mac 系统可以借助 HomeBrew 进行安装,命令如下:
brew install gpg
Windows 系统需要访问 下面的地址 手动下载安装:
http://www.gnupg.org/download/
安装完成之后,输入以下命令创建密钥:
gpg --full-generate-key
接下来会弹出一系列的选项让你选择,比如密钥的类型,密钥的长度,密钥过期时间等。如果没有什么特殊需求的话,一路点击回车,使用默认选项就好了。
除此之外,还会要求你填写姓名、邮箱等内容,以及为这个密钥设置密码。
以上内容都填写完成之后,你就可以看到你创建的密钥了:
接下来,需要把刚刚创建好的密钥公钥上传到 GPG 密钥服务器。这样 MavenCentral 到时候可以从 GPG 密钥服务器上拿到我们的密钥公钥,从而对上传的包进行验证。
上传命令如下:
gpg --keyserver hkps://keys.openpgp.org --send-keys 1D9884654E707CAC429D357576150A27FD3EC1DF
其中 --keyserver
参数指定密钥服务器为 hkps://keys.openpgp.org
,--send-keys
参数指定要上传的公钥 ID。
上传完成后进行搜索以验证上传是否成功:
gpg --keyserver hkps://keys.openpgp.org --search-keys 1D9884654E707CAC429D357576150A27FD3EC1DF
输出以下结果认为上传成功:
gpg: data source: https://keys.openpgp.org:443
(1) 256 bit EDDSA key 76150A27FD3EC1DF, 创建于:2023-10-26
Keys 1-1 of 1 for "1D9884654E707CAC429D357576150A27FD3EC1DF". 输入数字以选择,输入 N 翻页,输入 Q 退出 > 1
gpg: 密钥 76150A27FD3EC1DF:没有用户标识
gpg: 处理的总数:1
也可以在 OpenPGP 密钥官网 上输入公钥的 ID 进行搜索:https://keys.openpgp.org
最后一步,执行以下命令生成私钥文件:
gpg --export-secret-keys -o 文件路径/secring.gpg
这个私钥文件一定要在你本地保存好(避免泄露),后面提交库的时候还需要用到它。
使用 Gradle 发布
以上所有步骤全部完成之后,下面就可以开始发布我们编写的开源库了。
为了让发布过程变得更加简单,我使用了 gradle-maven-publish-plugin
这样一个第三方开源插件。当然如果你直接使用官方的 maven-publish
插件也是可以实现同样的功能的,只是得额外写不少代码才行。
gradle-maven-publish-plugin
插件的开源库地址是:
https://github.com/vanniktech/gradle-maven-publish-plugin
插件官网 为:
https://vanniktech.github.io/gradle-maven-publish-plugin
首先在项目级别的 build.gralde.kts
中引入插件:
plugins {
id("com.vanniktech.maven.publish") version "0.22.0" apply false
}
然后在模块级别的 build.gradle.kts
中启用插件:
plugins {
id("com.vanniktech.maven.publish")
}
然后打开项目级别的 gradle.properties
文件,在其中增加下面的模板内容:
# Group Id, 我这里使用的二级域名
GROUP=com.sunxiaodou.android
# Artifact Id
POM_ARTIFACT_ID=mask
# Version
VERSION_NAME=0.0.7
POM_NAME=Mask
POM_DESCRIPTION=Used to hide Java/Kotlin methods or construction methods in the SDK.
POM_INCEPTION_YEAR=2021
POM_URL=https://github.com/guodongAndroid/Mask
POM_LICENSE_NAME=The Apache Software License, Version 2.0
POM_LICENSE_URL=https://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENSE_DIST=repo
POM_SCM_URL=https://github.com/guodongAndroid/Mask
POM_SCM_CONNECTION=scm:git:git://github.com/guodongAndroid/Mask.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://[email protected]/guodongAndroid/Mask.git
POM_DEVELOPER_ID=guodongAndroid
POM_DEVELOPER_NAME=guodongAndroid
POM_DEVELOPER_URL=https://github.com/guodongAndroid/Mask
# 仓库类型 S01:s01.oss.sonatype.org
SONATYPE_HOST=S01
# 是否自动发布
SONATYPE_AUTOMATIC_RELEASE=false
# 开启 Release 签名
RELEASE_SIGNING_ENABLED=true
模板的前三项决定了开源库的坐标(GAV),比如按照模板内容的写法,那么这个开源库的坐标就是:
com.sunxiaodou.android:mask:0.0.7
其他几项多是一些说明性的内容,根据自己的实际情况填写就可以了。
如果有多个模块需要上传,则在每个模块的根目录下创建一个
gradle.properties
文件并填入该模块自己相应的 POM 内容,如:POM_ARTIFACT_ID
,POM_NAME
,POM_DESCRIPTION
等。
还需要提供 Sonatype 的账号密码以及用于签名的 GPG 密钥。为了使它们不受版本控制,建议将其放入用户主目录 gradle.properties
文件:
# ~/.gradle/gradle.properties
mavenCentralUsername=username
mavenCentralPassword=the_password
# 公钥ID的后八位
signing.keyId=12345678
# 私钥密码
signing.password=some_password
signing.secretKeyRingFile=/Users/yourusername/.gnupg/secring.gpg
更多内容可以参考 插件官网的介绍 :
https://vanniktech.github.io/gradle-maven-publish-plugin/central/#secrets
将隐私内容放入用户主目录
gradle.properties
文件后,其他项目也可以使用。
最后执行以下 Gradle task 就可以将库发布了:
./gradlew publishAllPublicationsToMavenCentral
如果一切顺利,我们的库就发布成功了。
同步至 MavenCentral
但是到这里还没完。
我们的库并没有真正发布到 MavenCentral,MavenCentral 也不允许我们直接将库发布上去,我们只是将库发布到了 s01.oss.sonatype.org
,我们在项目级别的 gradle.properties
里增加的模板内容:
# 仓库类型 S01:s01.oss.sonatype.org
SONATYPE_HOST=S01
# 是否自动发布
SONATYPE_AUTOMATIC_RELEASE=false
Maven Central 的发布过程有以下几个步骤:
- 在 Sonatype OSS 上创建临时仓库,
- 工件已上传到此临时仓库,
- 关闭临时仓库,
- 发布临时仓库,
- 已发布仓库中的所有工件将同步至 MavenCentral。
我们上一步的发布工作只自动执行了前三个步骤,将 SONATYPE_AUTOMATIC_RELEASE
修改为 true
后即可自动发布并同步至 MavenCentral。
https://s01.oss.sonatype.org/
也可以使用 Sonatype 的账号密码登录 S01仓库 后在网站上操作:
- 在左侧栏中点击 Staging Repositories 选项,在标签页中找到刚刚发布的库,
- 选择库,点击 Close 按钮,并在弹出的确认窗口中点击 Confirm,
- Close 完毕之后,刷新界面,你会发现 Release 按钮就变成可点击的状态了,
- 选择库,点击 Release 按钮,并在弹出的确认窗口中点击 Confirm,
- Release 后库就会同步至 MavenCentral。
发布之后,通常需要 30 分钟才会同步至 MavenCentral,可以在以下网站中搜索发布的库:
- Maven Central:https://central.sonatype.com/
- Maven Central Repository Search:https://search.maven.org/
其中第一个网站同步的较快,第二个网站同步的较慢。以下是第一个网站的搜索结果:
如何使用这个库?请参考:
Github Mask:https://github.com/guodongAndroid/Mask