跳至主要內容

发布至MavenCentral

guodongAndroid大约 8 分钟

流程概览

要将库发布至 MavenCentral 一般需要以下几个步骤:

  1. 注册 Sonatype 账号,
  2. 创建 Jira 工单用于开通发布权限,
    1. 使用自有域名或者 io.github
    2. 验证域名或 Github 归属
  3. 使用 GPG 创建密钥用于对发布的库进行签名
  4. 使用 Gradle 发布至 S01
  5. 同步至 MavenCentral

以上就是将库发布至 MavenCentral 的一般步骤,下面根据流程一步步开始吧。

注册账号

首先访问以下地址去注册一个 Sonatypeopen in new window 账号:

https://issues.sonatype.org/secure/Dashboard.jspa

注册完成后再登录即可进入 System Dashboard 界面。

现在点击顶部工具栏上的 Create/新建 按钮创建一个工单:

Create Ticket Btn

这个工单虽然看上去要填很多项内容,但其实还是非常简单的:

Create Ticket

我们只需要填写带星号的必填项即可。

  • 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/新建 完成工单创建。

创建完工单之后需要等待工作人员审核,工作时间审核较快。如果你是在周末创建的工单,那么可能需要等待两到三天的时间才会有人处理。

有工作人员处理你的工单之后,他会在你的工单里留下一条评论,如下图所示:

Indicate Comment

这条评论的意思就是,你要证明刚才你在 Group Id 里填写的包路径所对应的域名是你的。

证明的方式就是,在你的域名中添加一条类型为 TXT 的解析,并将它指向你这条工单的 URL 地址:

DNS TXT

如果是使用的 Github,需要在 Github 上创建一个名为 OSSRH-96095 的公开仓库以验证 Github 账号的所属。

添加完解析记录(Github 仓库已创建)后,你需要在工单里回复一下,可以直接简单评论一句 Done 即可。这样工作人员会去验证你添加的解析记录是否已生效(Github 仓库是否已创建),验证没有问题之后,将会在评论里告诉你申请已通过:

Ticket Success

从评论里得知,我们现在已经有权限向 s01.oss.sonatype.org 这个地址发布库了。

创建密钥

MavenCentral 还要求,所有发布的库都必须使用 GPG 来进行签名才行,所以接下来我们就进行这个操作。

GPG 在一些 Linux 系统上是内置的,如果你使用的 Linux 系统没有内置的话可以通过以下命令进行安装:

sudo apt install gnupg

Mac 系统可以借助 HomeBrew 进行安装,命令如下:

brew install gpg

Windows 系统需要访问 下面的地址open in new window 手动下载安装:

http://www.gnupg.org/download/

安装完成之后,输入以下命令创建密钥:

gpg --full-generate-key

接下来会弹出一系列的选项让你选择,比如密钥的类型,密钥的长度,密钥过期时间等。如果没有什么特殊需求的话,一路点击回车,使用默认选项就好了。

除此之外,还会要求你填写姓名、邮箱等内容,以及为这个密钥设置密码。

以上内容都填写完成之后,你就可以看到你创建的密钥了:

Generate key

接下来,需要把刚刚创建好的密钥公钥上传到 GPG 密钥服务器。这样 MavenCentral 到时候可以从 GPG 密钥服务器上拿到我们的密钥公钥,从而对上传的包进行验证。

上传命令如下:

gpg --keyserver hkps://keys.openpgp.org --send-keys 1D9884654E707CAC429D357576150A27FD3EC1DF

其中 --keyserver 参数指定密钥服务器为 hkps://keys.openpgp.org--send-keys 参数指定要上传的公钥 ID。

  • 密钥服务器可以参考 官网open in new window:https://central.sonatype.org/publish/requirements/gpg/#distributing-your-public-key,官网上给了三个密钥服务器,经过测试我这边只有 keys.openpgp.org 可用。
  • OpenPGP 使用参考 官网open in new window:https://keys.openpgp.org/about/usage#gnupg

上传完成后进行搜索以验证上传是否成功:

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 密钥官网open in new window 上输入公钥的 ID 进行搜索:https://keys.openpgp.org

最后一步,执行以下命令生成私钥文件:

gpg --export-secret-keys  -o 文件路径/secring.gpg

这个私钥文件一定要在你本地保存好(避免泄露),后面提交库的时候还需要用到它。

使用 Gradle 发布

以上所有步骤全部完成之后,下面就可以开始发布我们编写的开源库了。

为了让发布过程变得更加简单,我使用了 gradle-maven-publish-plugin 这样一个第三方开源插件。当然如果你直接使用官方的 maven-publish 插件也是可以实现同样的功能的,只是得额外写不少代码才行。

gradle-maven-publish-pluginopen in new window 插件的开源库地址是:

https://github.com/vanniktech/gradle-maven-publish-plugin

插件官网open in new window 为:

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_IDPOM_NAMEPOM_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

更多内容可以参考 插件官网的介绍open in new window

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 的发布过程有以下几个步骤:

  1. 在 Sonatype OSS 上创建临时仓库,
  2. 工件已上传到此临时仓库,
  3. 关闭临时仓库,
  4. 发布临时仓库,
  5. 已发布仓库中的所有工件将同步至 MavenCentral。

我们上一步的发布工作只自动执行了前三个步骤,将 SONATYPE_AUTOMATIC_RELEASE 修改为 true 后即可自动发布并同步至 MavenCentral。

https://s01.oss.sonatype.org/

也可以使用 Sonatype 的账号密码登录 S01仓库open in new window 后在网站上操作:

  1. 在左侧栏中点击 Staging Repositories 选项,在标签页中找到刚刚发布的库,
  2. 选择库,点击 Close 按钮,并在弹出的确认窗口中点击 Confirm,
  3. Close 完毕之后,刷新界面,你会发现 Release 按钮就变成可点击的状态了,
  4. 选择库,点击 Release 按钮,并在弹出的确认窗口中点击 Confirm,
  5. Release 后库就会同步至 MavenCentral。

发布之后,通常需要 30 分钟才会同步至 MavenCentral,可以在以下网站中搜索发布的库:

  1. Maven Centralopen in new window:https://central.sonatype.com/
  2. Maven Central Repository Searchopen in new window:https://search.maven.org/

其中第一个网站同步的较快,第二个网站同步的较慢。以下是第一个网站的搜索结果:

Release Success

如何使用这个库?请参考:

Github Maskopen in new window:https://github.com/guodongAndroid/Mask