使用 gradle 将项目上传到 maven 中央库

用 AS 开发也有一段时间了,发现 AS 可以使用 maven,在 gradle 中可以很方便的解决依赖问题,再也不用去下载相应的 jar 包了。gradle 添加一些依赖库比较方便,但是如果想把自己的一些开源项目上传到 maven 中央库给别人使用,就稍微有些麻烦了。现在比较简单的办法是先将自己在 github 上的项目提交到 Sonatype,然后再同步到 maven 中央库去,大致说一下流程。

注册 JIRA 账号

要想把项目提交到 Sonatype,首先得得去 Sonatype Issue 去注册一个 JIRA 账号,注册流程很简单,挨着填写就 ok 了,这个账号在后面配置的时候要用到。

创建一个 issue

账号注册好之后,就开始创建一个 issue,这个 issue 对应你的一个项目,在上面导航栏中有个 Create 按钮:
img
然后再弹出的对话框中填写项目的信息:
img
img
其中 Group Id 很重要,一般为自己的域名,这个在后面提交项目的时候要用到。创建好 issue 后,接下来就是等待,然后工作人员会给你发送邮件。这个时候可以在导航栏中的 Issue 中找到自己创建的 issue,到下面的 comments 可以看到工作人员问你之前填写的 group id 这个域名是否是你的,回答是,然后工作人员就会让你提交你的项目到 Sonatype:
img

生成 GPG 密钥,用于上传的文件加密和签名

linux 下可以直接使用 gpg。windows 上则可以使用 git 自带的 gpg (如果没有安装 git,可以直接安装 gpg4win),在 cmd 中执行:

1
$ gpg --gen-key

姓名,邮箱以及备注要认真填写,最后要求输入 passphase,这个是密码,上传 maven 要用到。

1
2
3
4
5
6
7
$ gpg --list-keys --keyid-format SHORT
/home/xxxx/.gnupg/pubring.kbx
-------------------------------
pub rsa4096/BB090204 2019-01-03 [SC]
7B0A1A36C235E95636B75C53D781EED2BB090204
uid [ultimate] Vincent Cheung (coolerfall.com) <coolingfall@gmail.com>
sub rsa4096/9123FD1A 2019-01-03 [E]

其中 BB090204 是 key id,接下来将公钥上传至服务器:

1
$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys BB090204

gpg 2.1 之后需要手动导出 secring:

1
gpg --keyring secring.gpg --export-secret-keys > ~/.gnupg/secring.gpg

使用 gradle 提交项目到 Sonatype

在网上找到了 Chris Banes 写的 gradle-mvn-push.gradle 脚本,参照这个基本就可以了,然后将这个脚本在你项目的 build.gradle 的最后加入 apply from: '../maven_push.gradle',如果想发布 jar,需要在脚本中加入:

1
2
3
artifacts {
archives packageReleaseJar
}

然后需要在项目下的 gradle.properties 中加入相应参数的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
VERSION_NAME=1.3.0
POM_GROUP_ID=com.coolerfall
POM_NAME=Http Download Manager
POM_ARTIFACT_ID=android-http-download-manager
POM_DESCRIPTION=An useful and effective http/https download manager for Android, support breakpoint downloading
POM_URL=https://github.com/Coolerfall/Android-HttpDownloadManager
POM_SCM_URL=https://github.com/Coolerfall/Android-HttpDownloadManager
POM_SCM_CONNECTION=scm:git@github.com:Coolerfall/Android-HttpDownloadManager.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:Coolerfall/Android-HttpDownloadManager.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=repo
POM_PACKAGING=jar

POM_DEVELOPER_ID=coolerfall
POM_DEVELOPER_NAME=Vincent Cheung
POM_INCEPTION_YEAR=2014

VERSION_NAME 如果后面带有 SNAPSHOT 字符串将会提交到 snapshots,这个不需要同步就可以下载 jar 以及源码等,如果不加则是发布 release 版本,这个就需要同步到 maven center 了。然后还需要在 C:/Users/xxx/.gradle/gradle.properties 中添加 Sonatype 账号、密码以及签名信息

1
2
3
4
5
6
NEXUS_USERNAME=username
NEXUS_PASSWORD=password

signing.keyId=BB090204
signing.password=password
signing.secretKeyRingFile=C:/Users/xxx/AppData/Roaming/gnupg/secring.gpg

其中 signing.password 就是刚刚生成 gpg 时候的 passphase。接下来就可以使用 gralde 提交项目:

1
$ %GRADLE_HOME%/bin/gradle uploadArchives

我使用的是 AS 最新版本,gradle home 在 AS 目录下(如果不是请自行找到 gradle home)
登陆到 Sonatype Nexus,查看 Staging Repositories,然后在搜索中过滤出你的 Group Id,就可以看到你刚刚提交的项目,接下来发布 release 版本了,先 close 再 Release:
img
然后在 Sonatype Issue 给工作人员回复,你已经成功发布,让他们帮你同步到 maven 中央库去:
img
最后就是等待工作人员给你同步,成功同步后,一般 10 几分钟左右就可以在 maven center 搜索到你的项目了,这样就可以在 AS 中使用 gradle 来添加依赖了。如果对 gradle-mvn-push.gradle 配置还有什么疑问,请参考我的项目:Android-HttpDownloadManger
ps: 如果创建 issue 的时候,工作人员回复 Only one JIRA issue per top-level groupId is necessary. You should already have all the necessary permissions to deploy and new artifacts to this groupId or to any sub-groups thanks to OSSRH-14919., 说明之前已经成功的 release 了一个项目,就不需要再创建一个新的 issue 了,直接将项目提交到 snapshots,并进行 closed 和 realease 操作即可,过 10 分钟左右就可以在 gradle 中使用了。