目录
一、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依赖成功
九、总结
成功上传效果图
一、SonaType账户注册与登录
(1)注册
想要推送到maven中央仓库,须先完成账户注册。
访问SonaType官网:https://issues.sonatype.org/
(2)登录
登录成功
二、创建工单
创建一个工单项目为Maven Central,由外国人跟踪工单审核后即可上传到Maven仓库的快照库和发布库。(说明:所有Maven Central的资源库,都从Maven发布库间隔几小时更新)
工单新建后:耐心等待外国大佬审核,他们处理后会向注册时提供的邮箱发送一条英文邮箱。翻译后如下:
另外注意一点:Already Synced to Central 必须选为Yes, 将自己的依赖库aar自动同步到中央仓库。
(1)Github子域名验证
按照邮箱要求创建了项目后,耐心等待外国大佬回复即可。
(2)自定义域名验证
本人有自己备案的域名,因此需要去腾讯云DNS解析加上TXT记录。
这里已经完成添加,接下来怎么办?当然是催审了,直接在项目下方追加评论。 英语不好,先翻译copy复制过去。
等着回复就行......任何更新状态不管自己新增、追加平台、响应我们,都会通过邮箱通知的。
由于审核时间耽误我写博客,此处用我上一次工单的信息来继续
三、登录Nexus Repository Manager
访问仓库管理首页: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签名生成和发布
GPG是RSA算法加解密软件,将生成的公钥上传到公网能访问的公开密钥库中,其他服服务解密验证私钥后可以进行相关安全的业务操作。因次,SonaType也需要对aar包、jar等依赖库进行加密传输与解密下载,因此需要用到GPG。GPG可以按照在客户端,生成公钥后发布到公网能访问的公开密钥中,私钥本地存储。私钥证书有文件、keyId、密码。这些会在推送资源包时用到。
GPG安装和使用及生成公钥发布到公网库、私钥存储、keyID(证书指纹后8位)、password 详见:Windows平台GPG签名生成和发布_gpg1.50.2下载_VinRichard的博客-CSDN博客
五、Android推送aar包
Android借助Gradle推送,Gradle7.0以下使用 apply plugin: 'maven'、Gradle7.0以上 使用 apply plugin: 'maven-publish',本文使用的是Grale7.0以上。
(1)配置私钥
在AndroidStudio的gradle.properties配置文件中,编辑以下信息
# Signing Plugin Config
signing.keyId= 证书指纹后8位
signing.password=证书密码
signing.secretKeyRingFile=file:H://xx//xx//_SECRET.gpg 证书本地绝对路径
(2)配置Gradle推送参数
在Moudle根目录新建文件:snapshot-sonatype-publish.gradle(配置快照库),release-sonatype-publish.gradle(配置发布库)。配置内容如下:(本人习惯分开配置,因为尝试过用一个配置文件,在其中判断版本后缀是否带有SNAPSHOT来动态选择推送是发布库还是快照库)
snapshot-sonatype-publish.gradle
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.srcDirsclasspath += 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 IdartifactId 'xxx' //项目唯一标识符,对应项目名称version '1.0.0-SNAPSHOT' //发布为版本后缀是SNAPSHOT//artifact(javadocJar)//将javadoc文档工件打包进aarartifact(sourcesJar)//将Java注释工件打包进aar// 依赖 bundleDebugAar 任务,并上传其产出的aarartifact(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:jarname = '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'//许可URLurl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'}}//开发者SonaType账号的信息——右上角用户信息——汇总 头像下方的三条信息developers {developer {//全名id = 'xxx'//用户名name = 'xxx'//邮箱email = 'xxx@qq.com'}}}}}}
}//配置上传SonaType仓库Maven地址和密码
publishing {repositories {//开发版maven {url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'credentials {username = getRepositoryUsername()password = getRepositoryPassword()}}}
}
release-sonatype-publish.gradle
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.srcDirsclasspath += 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 IdartifactId 'xxx' //项目唯一标识符,对应项目名称version '1.0.0-SNAPSHOT' //发布为版本没有//artifact(javadocJar)//将javadoc文档工件打包进aarartifact(sourcesJar)//将Java注释工件打包进aar// 依赖 bundleDebugAar 任务,并上传其产出的aarartifact(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:jarname = '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'//许可URLurl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'}}//开发者SonaType账号的信息——右上角用户信息——汇总 头像下方的三条信息developers {developer {//全名id = 'xxx'//用户名name = 'xxx'//邮箱email = 'xxx@qq.com'}}}}}}
}//配置上传SonaType仓库Maven地址和密码
publishing {repositories {//发布版maven {url 'https://s01.oss.sonatype.org/content/repositories/releases/'credentials {username = getRepositoryUsername()password = getRepositoryPassword()}}}
}
将配置引入Module的build.gradle
plugins {id 'com.android.library'
}
//sonatype平台的maven中央库配置文件
//发布版
//apply from: "release-sonatype-publish.gradle"
//开发版
apply from: "snapshot-sonatype-publish.gradle"android {compileSdk 31defaultConfig {minSdk 16targetSdk 33versionCode 1versionName "1.0"...
至此,配置完成!
六、开始推送
此处将moudle名为utils的aar包推送到Maven快照库。
七、验证推送成功
(1)nexus repository manager 快照版
(2)nexus repository manager 发布版
(3)https://mvnrepository.com/
八、使用发布成功的aar
(1)nexus repository manager
//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
(2)已发布到mvnrepository(中央仓库)
mavenCentral()
说明:必须在AndroidStudio项目根目录setting.gradle问加入mavenCentral()
(3)引入aar依赖成功
九、总结
仅自己学习记录,如有错误,敬请谅解~,谢谢~~