工作中或多或少会写一些和业务流程没有直接关联的代码,比如框架、工具类或者自定义控件之类。一般情况下,我们或许会去以前的项目里面去粘贴复制。如果项目是以前公司的,这就会跟尴尬了;如果是现公司的不同项目,也意味着我们后期可能要维护好几份相同的代码,长期如此肯定是不方便的。
这时候,就应该把这些和业务流程无关的代码,放到开源类库里面。
一般而言,将Library打包发布到maven有两种情景
- 私有仓库:使用 nexus 搭建,一般情况是公司自行搭建的私有Maven 仓库,当然也有个人开发者在自己的云服务器上搭建的
- 公共仓库:发布到 Maven Central 仓库或 JCenter 仓库,基本上是个人项目,或者公司的开源项目
以下主要讲的是发布到公共仓库的方法,私有仓库的搭建可以自行查找nexus相关资料
基本流程如下
1.注册sonatype
2.提交issue
3.上传构件
4.发布构件
5.在之前的issue下回复工作人员发布成功
6.发布完成
以上步骤中,⑤只有在第一次发布release时需要
一、注册
注册sonatype
二、Issue
a) 创建issue
-
Project 选择
Community Support - Open Source Project Repository Hosting (OSSRH)
-
Type 选择
New Project
- Summary 填写项目名称
- Description 填写项目描述
- Attachment 如果有自己的域名需要上传域名证书
- Group Id 项目工程所使用的groupId,可以使用com.github.xxxx。如果使用了自己的域名,需要证实自己拥有该域名,下面会详细说明
- Project URL 项目所在地址,比如github地址
- SCM url 源代码控制地址,比如github地址
- Username 可以操作部署该项目的用户
-
Already Synced to Central 是否已经同步到中央仓库,很明显没有
b) 等待审批通过
1.如果在上述创建issue过程中,groupId为自己的域名,管理员会让你先证实你拥有该域名
- 将TXT记录添加到您的DNS引用此问题
- 设置重定向到Github页面
- 发送电子邮件至central@sonatype.com,从uniquext.com电子邮件地址引用此问题
2.审批通过后,管理员会根据你的groupId开辟工作空间,并告知各个库的使用方式,我们仅需要了解以下三个
- 发布到快照库:https://oss.sonatype.org/content/repositories/snapshots
- 发布到暂存库: https://oss.sonatype.org/service/local/staging/deploy/maven2
- 下载快照或发布版控件:https://oss.sonatype.org/content/groups/public
3.当发布第一个正式版本时,需要来这里评论通知管理员
please comment on this ticket when you promoted your first release, thanks
三、上传控件
- snapshot:同一个版本号可以发布多个,后发布的会覆盖先发布的
- release:同一个版本号有且只能存在一个,上传时需要详细的配置及gpg效验
1.build.gradle编写
以下代码具体使用情况可参考项目LightPermission
a) 上传快照版
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = GROUP
pom.artifactId = ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: REPOSITORY_SNAPSHOTS) {
authentication(userName: "SONATYPE_USERNAME", password: "SONATYPE_PASSWORD")
}
}
}
}
}
b) 上传正式版
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
pom.groupId = GROUP
pom.artifactId = ARTIFACT_ID
pom.version = VERSION_NAME
pom.project {
name = PROJECT_NAME
description = PROJECT_DESCRIPTION
url = PROJECT_URL
scm {
url PROJECT_URL
tag VERSION_NAME
connection SCM
developerConnection SCM
}
developers {
developer {
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
licenses {
license {
name LICENSES_NAME
url LICENSES_URL
}
}
}
repository(url: REPOSITORY_RELEASE) {
authentication(userName: "SONATYPE_USERNAME", password: "SONATYPE_PASSWORD")
}
}
}
}
signing {
required {
gradle.taskGraph.hasTask("uploadArchives")
}
sign configurations.archives
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
}
2.上传
在gradle中执行uploadArchives
命令,等待完成即可
3. gpg效验
什么是 GnuPG - 维基百科,自由的百科全书
以下流程使用平台为Windows
,其他平台的童鞋请自行Google(╹▽╹)
a)下载 Gpg4win
b)安装 一路next
就行 -。-
c)文件 -> 新建密钥对 -> 创建个人OpenPGP密钥对
d)在服务器上发布
e)导出到本地,文件后缀为.gpg
注:如果后续在暂存区关闭构件时报错,提示在服务器找不到密钥,可以在 设置 中选择 配置Klopatra,将密钥服务器修改为http://pool.sks-keyservers.net:11371
四、发布构件
如果上传的是snapshot,不会进入暂存库
- 登录 并 打开Staging Repositories
- 选择刚刚上传的构件,一般来说拉到最下面就是了,建议搜索筛选,后续可能会需要多次刷新列表状态
- 点击 Close,等待暂存库状态变更
- 如果没有报错,再次勾选构件,点击Release
- 如果上述有报错(可在底部的Activity中查看),基本是第三步gradle配置的文图,根据错误描述修改即可
- 发布后即可前往https://search.maven.org搜索到刚刚发布的构建了
五、回复Issue
回到最初的issue,通知管理员激活中央库同步
Central sync is activated for com.uniquext.android. After you successfully release, your component will be published to Central, typically within 10 minutes, though updates to search.maven.org can take up to two hours.
注:仅在第一次release时需要
如果只是发布snapshot的话,整个流程相对来说还是比较简单的;
发布release的话,gradle.properties中的配置一个也不能少,而且还需要配置上传GPG
由于不是一边操作一边编写文章,很多图没办法截,敬请谅解~