目錄
一、SonaType賬戶注冊(cè)與登錄
????????(1)注冊(cè)
? ? ? ? (2)登錄
二、創(chuàng)建工單
? ? ? ? (1)Github子域名驗(yàn)證
(2)自定義域名驗(yàn)證
三、登錄Nexus Repository Manager
四、GPG簽名生成和發(fā)布
五、Android推送aar包
? ? ? ? (1)配置私鑰
? ? ? ? (2)配置Gradle推送參數(shù)
????????snapshot-sonatype-publish.gradle
????????release-sonatype-publish.gradle
????????將配置引入Module的build.gradle
六、開始推送
七、驗(yàn)證推送成功
? ? ? ? (1)nexus repository manager 快照版
?? ? ? ? (2)nexus repository manager 發(fā)布版
????????(3)https://mvnrepository.com/
八、使用發(fā)布成功的aar
????????(1)nexus repository manager
?????????(2)已發(fā)布到mvnrepository(中央倉(cāng)庫(kù))
? ? ? ? (3)引入aar依賴成功
九、總結(jié)
成功上傳效果圖
一、SonaType賬戶注冊(cè)與登錄
????????(1)注冊(cè)
? ? ? ? 想要推送到maven中央倉(cāng)庫(kù),須先完成賬戶注冊(cè)。
????????訪問(wèn)SonaType官網(wǎng):https://issues.sonatype.org/
? ? ? ? (2)登錄
?
登錄成功
二、創(chuàng)建工單
? ? ? ? 創(chuàng)建一個(gè)工單項(xiàng)目為Maven Central,由外國(guó)人跟蹤工單審核后即可上傳到Maven倉(cāng)庫(kù)的快照庫(kù)和發(fā)布庫(kù)。(說(shuō)明:所有Maven Central的資源庫(kù),都從Maven發(fā)布庫(kù)間隔幾小時(shí)更新)
? ? ? ? 工單新建后:耐心等待外國(guó)大佬審核,他們處理后會(huì)向注冊(cè)時(shí)提供的郵箱發(fā)送一條英文郵箱。翻譯后如下:
? ? ? ? 另外注意一點(diǎn):Already Synced to Central 必須選為Yes, 將自己的依賴庫(kù)aar自動(dòng)同步到中央倉(cāng)庫(kù)。
?
? ? ? ? (1)Github子域名驗(yàn)證
? ? ? ? 按照郵箱要求創(chuàng)建了項(xiàng)目后,耐心等待外國(guó)大佬回復(fù)即可。?
(2)自定義域名驗(yàn)證
? ? ? ? 本人有自己備案的域名,因此需要去騰訊云DNS解析加上TXT記錄。
????????這里已經(jīng)完成添加,接下來(lái)怎么辦?當(dāng)然是催審了,直接在項(xiàng)目下方追加評(píng)論。 英語(yǔ)不好,先翻譯copy復(fù)制過(guò)去。
?????????等著回復(fù)就行......任何更新狀態(tài)不管自己新增、追加平臺(tái)、響應(yīng)我們,都會(huì)通過(guò)郵箱通知的。
由于審核時(shí)間耽誤我寫博客,此處用我上一次工單的信息來(lái)繼續(xù)
三、登錄Nexus Repository Manager
????????訪問(wèn)倉(cāng)庫(kù)管理首頁(yè):Nexus Repository Manager
? ? ? ? 重要說(shuō)明:登錄這個(gè)賬戶與 SonaType注冊(cè)的賬戶一樣的。登錄前提:需要外國(guó)大佬全部審核通過(guò),給你開啟登錄權(quán)限、存儲(chǔ)權(quán)限才可以登錄上去。
????????說(shuō)明:在Android使用Maven推送插件將資源庫(kù)推送到Nexus Repository Manager 中,會(huì)依據(jù)Version是否帶有后綴來(lái)自動(dòng)選擇推送到快照庫(kù)還是發(fā)布庫(kù)。如1.0.0-SNAPSHOT 會(huì)推送到快照庫(kù), 1.0.0 會(huì)推送到發(fā)布庫(kù)。當(dāng)然你如果非要將1.0.0-SNAPSHOT推送到發(fā)布庫(kù)、1.0.0推送到快照庫(kù),其實(shí)也行,只是不太正規(guī)。。按照行內(nèi)規(guī)矩推送就行。
四、GPG簽名生成和發(fā)布
?????????GPG是RSA算法加解密軟件,將生成的公鑰上傳到公網(wǎng)能訪問(wèn)的公開密鑰庫(kù)中,其他服服務(wù)解密驗(yàn)證私鑰后可以進(jìn)行相關(guān)安全的業(yè)務(wù)操作。因次,SonaType也需要對(duì)aar包、jar等依賴庫(kù)進(jìn)行加密傳輸與解密下載,因此需要用到GPG。GPG可以按照在客戶端,生成公鑰后發(fā)布到公網(wǎng)能訪問(wèn)的公開密鑰中,私鑰本地存儲(chǔ)。私鑰證書有文件、keyId、密碼。這些會(huì)在推送資源包時(shí)用到。
? ? ? ? GPG安裝和使用及生成公鑰發(fā)布到公網(wǎng)庫(kù)、私鑰存儲(chǔ)、keyID(證書指紋后8位)、password 詳見:Windows平臺(tái)GPG簽名生成和發(fā)布_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 證書本地絕對(duì)路徑
? ? ? ? (2)配置Gradle推送參數(shù)
????????在Moudle根目錄新建文件:snapshot-sonatype-publish.gradle(配置快照庫(kù)),release-sonatype-publish.gradle(配置發(fā)布庫(kù))。配置內(nèi)容如下:(本人習(xí)慣分開配置,因?yàn)閲L試過(guò)用一個(gè)配置文件,在其中判斷版本后綴是否帶有SNAPSHOT來(lái)動(dòng)態(tài)選擇推送是發(fā)布庫(kù)還是快照庫(kù))
????????snapshot-sonatype-publish.gradle
apply plugin: 'maven-publish'
apply plugin: 'signing'
//倉(cāng)庫(kù)的用戶名
static def getRepositoryUsername() {
return "SonaType注冊(cè)的登錄用戶名"
}
//倉(cāng)庫(kù)的密碼
static def getRepositoryPassword() {
return "SonaType注冊(cè)的登錄密碼"
}
if (project.hasProperty("android")) { // Android庫(kù)
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庫(kù)
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
}
// 強(qiáng)制Java編碼為UTF-8
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//強(qiáng)制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
}
//配置上傳包的參數(shù)
afterEvaluate {
publishing {
publications {
myReleasePlugin(MavenPublication) {
groupId 'xxxx'//對(duì)應(yīng)sonatype平臺(tái)新建中的Group Id
artifactId 'xxx' //項(xiàng)目唯一標(biāo)識(shí)符,對(duì)應(yīng)項(xiàng)目名稱
version '1.0.0-SNAPSHOT' //發(fā)布為版本后綴是SNAPSHOT
//artifact(javadocJar)//將javadoc文檔工件打包進(jìn)aar
artifact(sourcesJar)//將Java注釋工件打包進(jìn)aar
// 依賴 bundleDebugAar 任務(wù),并上傳其產(chǎn)出的aar
artifact(tasks.getByName("bundleReleaseAar"))
// 依賴傳遞:pom文件中聲明依賴,從而傳遞到使用方,aar使用的依賴都打包進(jìn)這個(gè)moudle,引入這個(gè)moudle依賴時(shí),其他的依賴自動(dòng)下載。本人不使用,避免重復(fù)依賴太多,項(xiàng)目過(guò)大
// pom.withXml {
// def dependenciesNode = asNode().appendNode('dependencies')
// configurations.implementation.allDependencies.each {
// // 避免出現(xiàn)空節(jié)點(diǎn)或 artifactId=unspecified 的節(jié)點(diǎn)
// 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')
// }
// }
// }
//項(xiàng)目配置
pom {
packaging 'aar' //安卓Library庫(kù):aar 、后端Java:jar
name = 'xxx' // 發(fā)布庫(kù)的簡(jiǎn)單名稱 在maven倉(cāng)庫(kù)的命名
description = 'Androidxxx插件庫(kù)' // 發(fā)布庫(kù)的描述
url = 'https://github.com/用戶名/項(xiàng)目名' //Github項(xiàng)目首頁(yè)
//Git項(xiàng)目信息
scm {
//git項(xiàng)目連接地址
connection = 'https://https://github.com/用戶名/項(xiàng)目名.git'
//git項(xiàng)目開發(fā)者連接地址
developerConnection = 'https://github.com/用戶名/項(xiàng)目名.git'
//Github項(xiàng)目首頁(yè)
url = 'https://github.com/用戶名/項(xiàng)目名.git'
}
// 開放許可證書
licenses {
license {
//許可名稱
name = 'The Apache License, Version 2.0'
//許可URL
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//開發(fā)者SonaType賬號(hào)的信息——右上角用戶信息——匯總 頭像下方的三條信息
developers {
developer {
//全名
id = 'xxx'
//用戶名
name = 'xxx'
//郵箱
email = 'xxx@qq.com'
}
}
}
}
}
}
}
//配置上傳SonaType倉(cāng)庫(kù)Maven地址和密碼
publishing {
repositories {
//開發(fā)版
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'
//倉(cāng)庫(kù)的用戶名
static def getRepositoryUsername() {
return "SonaType注冊(cè)的登錄用戶名"
}
//倉(cāng)庫(kù)的密碼
static def getRepositoryPassword() {
return "SonaType注冊(cè)的登錄密碼"
}
if (project.hasProperty("android")) { // Android庫(kù)
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庫(kù)
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
}
// 強(qiáng)制Java編碼為UTF-8
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//強(qiáng)制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
}
//配置上傳包的參數(shù)
afterEvaluate {
publishing {
publications {
myReleasePlugin(MavenPublication) {
groupId 'xxxx'//對(duì)應(yīng)sonatype平臺(tái)新建中的Group Id
artifactId 'xxx' //項(xiàng)目唯一標(biāo)識(shí)符,對(duì)應(yīng)項(xiàng)目名稱
version '1.0.0-SNAPSHOT' //發(fā)布為版本沒(méi)有
//artifact(javadocJar)//將javadoc文檔工件打包進(jìn)aar
artifact(sourcesJar)//將Java注釋工件打包進(jìn)aar
// 依賴 bundleDebugAar 任務(wù),并上傳其產(chǎn)出的aar
artifact(tasks.getByName("bundleReleaseAar"))
// 依賴傳遞:pom文件中聲明依賴,從而傳遞到使用方,aar使用的依賴都打包進(jìn)這個(gè)moudle,引入這個(gè)moudle依賴時(shí),其他的依賴自動(dòng)下載。本人不使用,避免重復(fù)依賴太多,項(xiàng)目過(guò)大
// pom.withXml {
// def dependenciesNode = asNode().appendNode('dependencies')
// configurations.implementation.allDependencies.each {
// // 避免出現(xiàn)空節(jié)點(diǎn)或 artifactId=unspecified 的節(jié)點(diǎn)
// 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')
// }
// }
// }
//項(xiàng)目配置
pom {
packaging 'aar' //安卓Library庫(kù):aar 、后端Java:jar
name = 'xxx' // 發(fā)布庫(kù)的簡(jiǎn)單名稱 在maven倉(cāng)庫(kù)的命名
description = 'Androidxxx插件庫(kù)' // 發(fā)布庫(kù)的描述
url = 'https://github.com/用戶名/項(xiàng)目名' //Github項(xiàng)目首頁(yè)
//Git項(xiàng)目信息
scm {
//git項(xiàng)目連接地址
connection = 'https://https://github.com/用戶名/項(xiàng)目名.git'
//git項(xiàng)目開發(fā)者連接地址
developerConnection = 'https://github.com/用戶名/項(xiàng)目名.git'
//Github項(xiàng)目首頁(yè)
url = 'https://github.com/用戶名/項(xiàng)目名.git'
}
// 開放許可證書
licenses {
license {
//許可名稱
name = 'The Apache License, Version 2.0'
//許可URL
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//開發(fā)者SonaType賬號(hào)的信息——右上角用戶信息——匯總 頭像下方的三條信息
developers {
developer {
//全名
id = 'xxx'
//用戶名
name = 'xxx'
//郵箱
email = 'xxx@qq.com'
}
}
}
}
}
}
}
//配置上傳SonaType倉(cāng)庫(kù)Maven地址和密碼
publishing {
repositories {
//發(fā)布版
maven {
url 'https://s01.oss.sonatype.org/content/repositories/releases/'
credentials {
username = getRepositoryUsername()
password = getRepositoryPassword()
}
}
}
}
????????將配置引入Module的build.gradle
plugins {
id 'com.android.library'
}
//sonatype平臺(tái)的maven中央庫(kù)配置文件
//發(fā)布版
//apply from: "release-sonatype-publish.gradle"
//開發(fā)版
apply from: "snapshot-sonatype-publish.gradle"
android {
compileSdk 31
defaultConfig {
minSdk 16
targetSdk 33
versionCode 1
versionName "1.0"
...
至此,配置完成!
六、開始推送
? ? ? ? 此處將moudle名為utils的aar包推送到Maven快照庫(kù)。?
七、驗(yàn)證推送成功
? ? ? ? (1)nexus repository manager 快照版
?? ? ? ? (2)nexus repository manager 發(fā)布版
????????(3)https://mvnrepository.com/
八、使用發(fā)布成功的aar
????????(1)nexus repository manager
//SonaType Maven 倉(cāng)庫(kù)地址
maven { url 'https://s01.oss.sonatype.org/content/repositories/releases/'}
maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'}
說(shuō)明:必須在AndroidStudio項(xiàng)目根目錄setting.gradle問(wèn)加入以上兩行maven地址,下載依賴時(shí)會(huì)去里面下載(因?yàn)檫@里面是我們發(fā)布推送進(jìn)去的)。
使用快照版的,快照版去掉-SNAPSHOT
?????????(2)已發(fā)布到mvnrepository(中央倉(cāng)庫(kù))
mavenCentral()
?說(shuō)明:必須在AndroidStudio項(xiàng)目根目錄setting.gradle問(wèn)加入mavenCentral()
? ? ? ? (3)引入aar依賴成功
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-682011.html
九、總結(jié)
僅自己學(xué)習(xí)記錄,如有錯(cuò)誤,敬請(qǐng)諒解~,謝謝~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-682011.html
到了這里,關(guān)于(AS筆記)上傳aar包到Maven中央倉(cāng)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!