发布开源项目到Maven(Gradle + Sonatype)

背景

最近整理Android开发工具,想跟其他人分享,就有了将其发布到maven想法,所以考虑将库发布到maven,目前Android官方使用jCenter,比这个简单,后续补充(jCenter会自动同步Maven Center中的库)。
顺带避免:

Download the source to use it as library project

流程

整个流程很清晰:

  1. 获取JIRA Ticket,简单说就是去Issues Sonatype注册并提交issue
  2. GPG密钥,要上传到maven,需要GPG密钥
  3. 本地配置POM,即配置项目信息
  4. Gradle提交到Sonatype,通过脚本提交到Sonatype
  5. 发布版本,分为SNAPSHOT和Release版本

整个流程就是酱紫。OVER。

获取JIRA Ticket

注册JIRA帐号

提交项目到Sonatype,首先需要注册。打开(Issue Sonatype)注册JIRA帐号。

创建Issue

在导航上Create按钮,创建一个新的Issue。其中特别注意:

  1. Issue Type默认是new Project,按照默认就好
  2. Summer和Description填写你要创建项目的描述即可
  3. Group id特别关键,最好创建顶级Group ID,比如我需要com.hwangjr.xxx,那么Group ID填写为com.hwangjr,这样其他的库也可发布
  4. Project URL和SCM URL填GIT HUB项目地址即可
  5. 其他基本都懂

填写完毕,等待!工作人员会让你提交你的项目到Sonatype。

GPG密钥

密钥是为了上传文件的加密和签名。如果有安装git,那么应该是已经安装GPG了,以下默认命令为Linux下。

1
2
3
4
# 生成密钥
gpg --gen-key
# 查看
gpg --list-key

其中姓名、邮箱和备注需要认真填写下,最后输入的Passphase,是密码,上传maven需要使用。

pub 2048R/B53A8137 2015-11-24
uid hwangjr (Upload Modules For Maven By Sonatype.) huangjianrong2010@gmail.com
sub 2048R/2F11E234 2015-11-24

B53A8137是KEY ID。上传公钥到服务器:

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

本地配置POM

Chris Banes大神已经写完Gradle插件chrisbanes/gradle-mvn-push,可直接使用gradle-mvn-push.gradle,上面有详细的配置和使用方式。简要步骤为:

  1. 项目,保证是可以用Gradle编译。
  2. 更新HOME gradle.properties,修改USER_HOME/.gradle/gradle.properties文件。
  3. 在项目根目录下,创建文件gradle.properties
  4. 在想要上传的子模块下,分别创建gradle.properties
  5. 在子模块下,应用Gradle插件,即在build.gradle末尾加上apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' 或者下载gradle-mvn-push.gradle文件,放到根目录的gradle文件夹下,在build.gradle末尾加上apply from: rootProject.file('gradle/gradle-mvn-push.gradle')
  6. 编译并上传gradle clean build uploadArchives

其他属性:

1
2
RELEASE_REPOSITORY_URL (defaults to Maven Central's staging server)
SNAPSHOT_REPOSITORY_URL (defaults to Maven Central's snapshot server)

USER_HOME/.gradle/gradle.properties文件新增,内容修改为自身用户名密码,下面的就是创建的GPG密钥:

1
2
3
4
5
6
NEXUS_USERNAME=chrisbanes
NEXUS_PASSWORD=g00dtry

signing.keyId=ABCDEF12
signing.password=n1c3try
signing.secretKeyRingFile=/home/user/.gnupg/secring.gpg

项目根目录下的gradle.properties文件内容为,需要根据具体项目情况进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
VERSION_NAME=0.9.2-SNAPSHOT
VERSION_CODE=92
GROUP=com.github.chrisbanes.actionbarpulltorefresh

POM_DESCRIPTION=A modern implementation of the pull-to-refresh for Android
POM_URL=https://github.com/chrisbanes/ActionBar-PullToRefresh
POM_SCM_URL=https://github.com/chrisbanes/ActionBar-PullToRefresh
POM_SCM_CONNECTION=scm:git@github.com:chrisbanes/ActionBar-PullToRefresh.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:chrisbanes/ActionBar-PullToRefresh.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_DEVELOPER_ID=chrisbanes
POM_DEVELOPER_NAME=Chris Banes

子模块的gradle.properties文件内容为:

1
2
3
POM_NAME=ActionBar-PullToRefresh Library
POM_ARTIFACT_ID=library
POM_PACKAGING=aar

其中VERSION_NAME后面如果带SNAPSHOT会提交到Snapshots,这个不需要同步即可下载jar和源码,如果不加则为RELEASE版本,会同步到MAVEN CENTER。

Gradle脚本提交到Sonatype

运行命令:

1
gradle clean build uploadArchives

即会执行clean,并重新编译,上传到Sonatype。

发布版本

版本分为SNAPSHOT版本和RELEASE版本。
如果VERSION_NAME有加入SNAPSHOT,即为SNAPSHOT版本,不会同步到MAVEN。
如果没有SNAPSHOT,则会同步到MAVEN。

首次提交之后,登陆Sonatype Nexus Professional,查看Staging Repositories,找到提交的包,选择并close并Release,再到issue sonatype上提交的JIRA TICKET后面评论告知版本已经staged并released,可以进行sync,工作人员会进行同步。
同步成功之后,即可在maven center搜索到项目,可通过gradle添加依赖。

常规发布步骤

  1. 发布SNAPSHOT版本是否查看是否正常
  2. 发布RELEASE版本到线上,并进行同步
  3. 修改为下个SNAPSHOT版本

TIPS

发布JAR

如果想发布JAR,在本地配置POM时,修改gradle-mvn-push.gradle,在脚本中加入:
``` gradle
artifacts {
archives packageReleaseJar
}

发布时返回401

401为没有权限错误,检查:

  1. 用户名密码,可在gradle-mvn-push中打印日志查看用户名密码是否正确
  2. 检查Sonatype是否有权限

REFS

OSSRH Guide
GPG入门教程
gradle-mvn-push
Sonatype Nexus Professional
发布开源项目到Maven Central