目录
一、SonaType账户注册与登录
(1)注册
(2)登录
二、创建工单
(1)Github子域名验证
(2)自定义域名验证
三、登录Nexus Repository Manager
四、GPG签名生成和发布
五、Android推送aar包
(1)配置私钥
(2)配置Gradle推送参数
snapshot-sonatype-publish.gradle
release-sonatype-publish.gradle
将配置引入Module的build.gradle
六、开始推送
七、验证推送成功
(1)nexus repository manager 快照版
(2)nexus repository manager 发布版
(3)https://mvnrepository.com/
八、使用发布成功的aar
(1)nexus repository manager
(2)已发布到mvnrepository(中央仓库)
(3)引入aar依赖成功
九、总结
成功上传效果图
想要推送到maven中央仓库,须先完成账户注册。
访问SonaType官网:https://issues.sonatype.org/
登录成功
创建一个工单项目为Maven Central,由外国人跟踪工单审核后即可上传到Maven仓库的快照库和发布库。(说明:所有Maven Central的资源库,都从Maven发布库间隔几小时更新)
工单新建后:耐心等待外国大佬审核,他们处理后会向注册时提供的邮箱发送一条英文邮箱。翻译后如下:
另外注意一点:Already Synced to Central 必须选为Yes, 将自己的依赖库aar自动同步到中央仓库。
按照邮箱要求创建了项目后,耐心等待外国大佬回复即可。
本人有自己备案的域名,因此需要去腾讯云DNS解析加上TXT记录。
这里已经完成添加,接下来怎么办?当然是催审了,直接在项目下方追加评论。 英语不好,先翻译copy复制过去。
等着回复就行......任何更新状态不管自己新增、追加平台、响应我们,都会通过邮箱通知的。
由于审核时间耽误我写博客,此处用我上一次工单的信息来继续
访问仓库管理首页:Nexus Repository Manager
重要说明:登录这个账户与 SonaType注册的账户一样的。登录前提:需要外国大佬全部审核通过,给你开启登录权限、存储权限才可以登录上去。
说明:在Android使用Maven推送插件将资源库推送到Nexus Repository Manager 中,会依据Version是否带有后缀来自动选择推送到快照库还是发布库。如1.0.0-SNAPSHOT 会推送到快照库, 1.0.0 会推送到发布库。当然你如果非要将1.0.0-SNAPSHOT推送到发布库、1.0.0推送到快照库,其实也行,只是不太正规。。按照行内规矩推送就行。
GPG是RSA算法加解密软件,将生成的公钥上传到公网能访问的公开密钥库中,其他服服务解密验证私钥后可以进行相关安全的业务操作。因次,SonaType也需要对aar包、jar等依赖库进行加密传输与解密下载,因此需要用到GPG。GPG可以按照在客户端,生成公钥后发布到公网能访问的公开密钥中,私钥本地存储。私钥证书有文件、keyId、密码。这些会在推送资源包时用到。
GPG安装和使用及生成公钥发布到公网库、私钥存储、keyID(证书指纹后8位)、password 详见:Windows平台GPG签名生成和发布_gpg1.50.2下载_VinRichard的博客-CSDN博客
Android借助Gradle推送,Gradle7.0以下使用 apply plugin: 'maven'、Gradle7.0以上 使用 apply plugin: 'maven-publish',本文使用的是Grale7.0以上。
在AndroidStudio的gradle.properties配置文件中,编辑以下信息
# Signing Plugin Config
signing.keyId= 证书指纹后8位
signing.password=证书密码
signing.secretKeyRingFile=file:H://xx//xx//_SECRET.gpg 证书本地绝对路径
在Moudle根目录新建文件:snapshot-sonatype-publish.gradle(配置快照库),release-sonatype-publish.gradle(配置发布库)。配置内容如下:(本人习惯分开配置,因为尝试过用一个配置文件,在其中判断版本后缀是否带有SNAPSHOT来动态选择推送是发布库还是快照库)
apply plugin: 'maven-publish'
apply plugin: 'signing'
//仓库的用户名
static def getRepositoryUsername() {
return "SonaType注册的登录用户名"
}
//仓库的密码
static def getRepositoryPassword() {
return "SonaType注册的登录密码"
}
if (project.hasProperty("android")) { // Android库
task sourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
task javadoc(type: Javadoc) {
excludes = ['**/*.kt'] // 从javadoc文件中排除所有kotlin文件
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options.encoding = "utf-8"
options.charSet = "utf-8"
}
} else { //Java库
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
}
// 强制Java编码为UTF-8
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//强制JavaDoc编码为UTF-8
tasks.withType(Javadoc) {
options.encoding = "UTF-8"
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
//签名
signing {
//required { gradle.taskGraph.hasTask("afterEvaluate") }
sign configurations.archives
}
//配置上传包的参数
afterEvaluate {
publishing {
publications {
myReleasePlugin(MavenPublication) {
groupId 'xxxx'//对应sonatype平台新建中的Group Id
artifactId 'xxx' //项目唯一标识符,对应项目名称
version '1.0.0-SNAPSHOT' //发布为版本后缀是SNAPSHOT
//artifact(javadocJar)//将javadoc文档工件打包进aar
artifact(sourcesJar)//将Java注释工件打包进aar
// 依赖 bundleDebugAar 任务,并上传其产出的aar
artifact(tasks.getByName("bundleReleaseAar"))
// 依赖传递:pom文件中声明依赖,从而传递到使用方,aar使用的依赖都打包进这个moudle,引入这个moudle依赖时,其他的依赖自动下载。本人不使用,避免重复依赖太多,项目过大
// pom.withXml {
// def dependenciesNode = asNode().appendNode('dependencies')
// configurations.implementation.allDependencies.each {
// // 避免出现空节点或 artifactId=unspecified 的节点
// if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
// println "dependency=${it.toString()}"
// def dependencyNode = dependenciesNode.appendNode('dependency')
// dependencyNode.appendNode('groupId', it.group)
// dependencyNode.appendNode('artifactId', it.name)
// dependencyNode.appendNode('version', it.version)
// dependencyNode.appendNode('scope', 'implementation')
// }
// }
// }
//项目配置
pom {
packaging 'aar' //安卓Library库:aar 、后端Java:jar
name = 'xxx' // 发布库的简单名称 在maven仓库的命名
description = 'Androidxxx插件库' // 发布库的描述
url = 'https://github.com/用户名/项目名' //Github项目首页
//Git项目信息
scm {
//git项目连接地址
connection = 'https://https://github.com/用户名/项目名.git'
//git项目开发者连接地址
developerConnection = 'https://github.com/用户名/项目名.git'
//Github项目首页
url = 'https://github.com/用户名/项目名.git'
}
// 开放许可证书
licenses {
license {
//许可名称
name = 'The Apache License, Version 2.0'
//许可URL
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//开发者SonaType账号的信息——右上角用户信息——汇总 头像下方的三条信息
developers {
developer {
//全名
id = 'xxx'
//用户名
name = 'xxx'
//邮箱
email = '[email protected]'
}
}
}
}
}
}
}
//配置上传SonaType仓库Maven地址和密码
publishing {
repositories {
//开发版
maven {
url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
credentials {
username = getRepositoryUsername()
password = getRepositoryPassword()
}
}
}
}
apply plugin: 'maven-publish'
apply plugin: 'signing'
//仓库的用户名
static def getRepositoryUsername() {
return "SonaType注册的登录用户名"
}
//仓库的密码
static def getRepositoryPassword() {
return "SonaType注册的登录密码"
}
if (project.hasProperty("android")) { // Android库
task sourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
task javadoc(type: Javadoc) {
excludes = ['**/*.kt'] // 从javadoc文件中排除所有kotlin文件
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options.encoding = "utf-8"
options.charSet = "utf-8"
}
} else { //Java库
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
}
// 强制Java编码为UTF-8
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//强制JavaDoc编码为UTF-8
tasks.withType(Javadoc) {
options.encoding = "UTF-8"
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
//签名
signing {
//required { gradle.taskGraph.hasTask("afterEvaluate") }
sign configurations.archives
}
//配置上传包的参数
afterEvaluate {
publishing {
publications {
myReleasePlugin(MavenPublication) {
groupId 'xxxx'//对应sonatype平台新建中的Group Id
artifactId 'xxx' //项目唯一标识符,对应项目名称
version '1.0.0-SNAPSHOT' //发布为版本没有
//artifact(javadocJar)//将javadoc文档工件打包进aar
artifact(sourcesJar)//将Java注释工件打包进aar
// 依赖 bundleDebugAar 任务,并上传其产出的aar
artifact(tasks.getByName("bundleReleaseAar"))
// 依赖传递:pom文件中声明依赖,从而传递到使用方,aar使用的依赖都打包进这个moudle,引入这个moudle依赖时,其他的依赖自动下载。本人不使用,避免重复依赖太多,项目过大
// pom.withXml {
// def dependenciesNode = asNode().appendNode('dependencies')
// configurations.implementation.allDependencies.each {
// // 避免出现空节点或 artifactId=unspecified 的节点
// if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
// println "dependency=${it.toString()}"
// def dependencyNode = dependenciesNode.appendNode('dependency')
// dependencyNode.appendNode('groupId', it.group)
// dependencyNode.appendNode('artifactId', it.name)
// dependencyNode.appendNode('version', it.version)
// dependencyNode.appendNode('scope', 'implementation')
// }
// }
// }
//项目配置
pom {
packaging 'aar' //安卓Library库:aar 、后端Java:jar
name = 'xxx' // 发布库的简单名称 在maven仓库的命名
description = 'Androidxxx插件库' // 发布库的描述
url = 'https://github.com/用户名/项目名' //Github项目首页
//Git项目信息
scm {
//git项目连接地址
connection = 'https://https://github.com/用户名/项目名.git'
//git项目开发者连接地址
developerConnection = 'https://github.com/用户名/项目名.git'
//Github项目首页
url = 'https://github.com/用户名/项目名.git'
}
// 开放许可证书
licenses {
license {
//许可名称
name = 'The Apache License, Version 2.0'
//许可URL
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//开发者SonaType账号的信息——右上角用户信息——汇总 头像下方的三条信息
developers {
developer {
//全名
id = 'xxx'
//用户名
name = 'xxx'
//邮箱
email = '[email protected]'
}
}
}
}
}
}
}
//配置上传SonaType仓库Maven地址和密码
publishing {
repositories {
//发布版
maven {
url 'https://s01.oss.sonatype.org/content/repositories/releases/'
credentials {
username = getRepositoryUsername()
password = getRepositoryPassword()
}
}
}
}
plugins {
id 'com.android.library'
}
//sonatype平台的maven中央库配置文件
//发布版
//apply from: "release-sonatype-publish.gradle"
//开发版
apply from: "snapshot-sonatype-publish.gradle"
android {
compileSdk 31
defaultConfig {
minSdk 16
targetSdk 33
versionCode 1
versionName "1.0"
...
至此,配置完成!
此处将moudle名为utils的aar包推送到Maven快照库。
//SonaType Maven 仓库地址
maven { url 'https://s01.oss.sonatype.org/content/repositories/releases/'}
maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'}
说明:必须在AndroidStudio项目根目录setting.gradle问加入以上两行maven地址,下载依赖时会去里面下载(因为这里面是我们发布推送进去的)。
使用快照版的,快照版去掉-SNAPSHOT
mavenCentral()
说明:必须在AndroidStudio项目根目录setting.gradle问加入mavenCentral()
仅自己学习记录,如有错误,敬请谅解~,谢谢~~