Android发布库到MavenCentral说明以及踩坑解决
jcenter即将停止服务,由于之前我们好多库都是发布到jcenter上,现在必须抓紧找下家才行,我们针对jitpack和mavencentral进行了调研,结果如下:
jitpack的发包必须需要将源码发布到github上,这中情况对于我们的产品自用SDK的情况非常不友好
mavencentral不用公布源码到github上,和自建Nexus Repository Manager去管理发布库很类似,只要把需要配置的gradle选项配置到项目中去,并且把签名和发布地址以及账号配置好就可以通过Android Studio的gradle进行操作把包上传到Sonatye上进行Android包管理。
发包到mavencentral的具体操作流程和踩坑总结
一、 Sonatype jira的账号申请以及项目申请
首先;我们到SonatypeJira上边注册SonatypeJira账号。
需要在SonatypeJira中的issues projects界面中创建一个issue用来申请一个项目。
由于截图篇幅有限最下面的Already Synced to Central 选择 No,因为这是我们新申请的。
创建完成后,管理员会在第一时间处理新建的这个issue,等待管理员回复就可以,在后续的回复,如果不是在github上的开源项目,你要用自己的域名就需要在管理员的指导下完成域名的验证工作。域名验证完成后,这个issue的状态就回标识为RESOLVED,下面就可以准备使用gradle上传你的库了,只要在group id下的所有库都支持。
所有的issue操作都会同步到注册账号的邮箱上边,可以及时了解所有动态。
二、gradle脚本的准备
具体的详细配置官方说明Deploying to OSSRH with Gradle - Introduction,通过这篇文章可以找到标准的的发布包用的gradle脚本模板。下面我把我这用到的和大家分享一下完整版。
apply plugin: 'maven'
apply plugin: 'signing'
def ossrhUsername = "在SonaType上申请的账号"
def ossrhPassword = "在SonaType上申请的密码"
def PUBLISH_GROUP_ID = 'com.demo.sdk' //这里可以不是直接申请时候的groupId只要开头是就可以
def PUBLISH_ARTIFACT_ID = "引用库的artifactId"
def PUBLISH_VERSION = android.defaultConfig.versionName //这个是直接获取的库gradle里配置好的版本号,不用到处修改版本号,只需要维护一份就可以。
//签名
signing {
required { gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
repository(url: "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") {
authentication(userName: ossrhUsername, password: ossrhPassword)
}
snapshotRepository(url: "https://s01.oss.sonatype.org/content/repositories/snapshots/") {
authentication(userName: ossrhUsername, password: ossrhPassword)
}
pom.groupId = PUBLISH_GROUP_ID
pom.artifactId = PUBLISH_ARTIFACT_ID
pom.version = PUBLISH_VERSION
pom.project {
name '发布库的简单名称'
packaging 'aar' //我这里发布的是安卓的包,所有写的aar
// optionally artifactId can be defined here
description '发布包的描述'
url '可以写公司官网地址或github个人页面地址'
scm {
connection 'scm:替换成项目git地址'
developerConnection 'scm:替换为git开头的项目地址'
url '项目首页,可以是github项目的主页'
}
licenses {
license {
name 'The Apache License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id '这里填写申请账号时候的全名就可以'
name '这里随意填写就可以'
email '最好是申请账号时用的邮箱'
}
}
}
}
}
}
三、 签名
之所以签名作为这一块来说说明它很重要也很容易踩坑。我这里用的是Mac系统所以就以Mac系统来说明了。
1. 创建GPG密钥
在往上找到一些关于创建GPG密钥的文章,安装方式各异,我这里使用的命令行安装,不过首先Mac电脑上需要安装了brew才可以,相信brew怎么安装作为程序员的我们应该是必不可少的,这里就不赘述了,下面说一下如何安装GPG:
在命令行使用如下命令
brew install gpg
等待安装完成就可以。
2. 创建密钥
在命令行中使用如下命令作为开始
gpg --full-gen-key
在执行过程会让选择加密方式,我这边使用的是RSA and RSA,长度输入4096,过期时间直接回车代表不过期,然后提示让输入User ID和一个邮箱,这里可以使用注册SonaType时候用的用户名和邮箱,当然也可以用其他的。接着最后一步输入O,注意这里是大写的O不是零,然后回车接着就会提示让输入密码,输入一次后还会有一次确认输入,这个密码一定要记住后期会用到。
以上操作完成后,你可以到你的个人账号的目录去查看一下会有这么一个目录存在
~/.gnupg/openpgp-revocs.d
在这个目录下有一个.rev文件,记住这个文件名称的末尾8位字符在后续的配置文件会用到。
接下来创建gpg文件,通过如下命令创建,我建议先在命令行中把目录切到~/.gnupg/下再去执行如下命令这样不会找不到文件。
gpg --export-secret-keys -o secring.gpg
执行以上命令创建文件secring.gpg,创建过程会让输入上边我们创建密钥过程中输入的密码,验证完密码后会在~/.gnupg目录生成secring.gpg文件,这个文件的路径我们后续在生成配置文件的时候也需要。
3. 设置配置文件
在个人目录下.gradle创建配置文件gradle.properties,文件内容如下
signing.keyId=刚才获取的秘钥后8位
signing.password=之前我们执行命令时设置的密码
signing.secretKeyRingFile=刚才生成的secring.gpg文件目录
ossrhUsername=sonatype用户名
ossrhPassword=sonatype密码
记住这个配置文件一定放在.gradle目录下才会生效,这个问题困扰了我小半天时间。也就是完整路径是
~/.gradle/gradle.properties
如果路径不对或者这个配置文件不对,上传包到SonaType是没有问题,但是在操作close的时候你会发现出现问题了,签名总是出错,如果路径不对就会直接跳过签名这一步,然后在SonaType在操作上传好的包时根本到不了release这一步。如果想看看什么效果自己可以去试验一下。
四、发布的准备
通过上面的步骤我们已经把我们的要发布的包传到SonaType的nexus repository manager系统里了。
可以看到图中我写了很多字,由于我这里没有预发布的包所以我就以红框为例了,大家可以自行去发布查看具体的结构。
发布的步骤很简单,分为一下几步操作就可以
1. 登录nexus repository manager平台
我们上传到库都托管到nexus repository manager平台,所以我们需要使用之前申请的sonaType的账号去登录这个托管平台来管理我们的包。
2. 通过点击Staging Repositories去找到我们刚刚发布的包并继续发包流程。
包刚上传上来你会发现只有Refresh、Close和Drop可以点击,这个时候我们如果想立即发布直接点击Close,通过页面的下半部分可以看到处理的状态,刷新需要我们点击Refresh进行刷新,每一次点击Close都是一个单独的Task,如果Task中每个环节都是绿色通过的状态,那么这个包的状态就回变成closed,Release菜单就可以点击发布了,操作完后等待差不多10分钟就可以访问发布包的新版本了。
本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...