JCenter已經(jīng)提桶跑路,是時(shí)候?qū)W會(huì)上傳到Maven Central了
每天滿(mǎn)滿(mǎn)的干貨
我們之所以活得累,往往是因?yàn)榉挪幌旅孀觼?lái)做人。
由于微信公眾號(hào)近期改變了推送規(guī)則如果你第一時(shí)間看到我的文章就置頂星標(biāo)公眾號(hào)。


【文章目錄】
1. JCenter提桶跑路
2. 轉(zhuǎn)戰(zhàn)Maven Central
Step1:準(zhǔn)備環(huán)境
Step2:提交Issue
Step3:配置
Step4:上傳包(jar/aar)
3. 一些注意事項(xiàng)
4:示例工程
1. JCenter提桶跑路
用了這么多年的JCenter,終于要“跑路”了,還是有點(diǎn)依依不舍的。
詳情可以參見(jiàn)本公眾號(hào)的這篇文章:
以前也寫(xiě)過(guò)JCenter上傳的方法:
《2020最新通過(guò)novoda上傳到JCenter的方法、技巧及遇到的坑》
不過(guò)現(xiàn)在如果再想上傳包到JCenter已經(jīng)是不可以的了,提示如下:

2. 轉(zhuǎn)戰(zhàn)Maven Central
Google在 Android Studio 4.2 把Maven Central作為gradle的默認(rèn)配置了,所以我們還是把包放在官方指定的倉(cāng)庫(kù)中比較保險(xiǎn)。
相比JCenter這樣的第三方倉(cāng)庫(kù),Maven Central的操作就稍顯復(fù)雜,不過(guò)我們只要把思路理清理順了,其實(shí)也沒(méi)有那么難操作。
Step1:準(zhǔn)備環(huán)境
OS: Windows10
IDE: Android Studio 4.1.3
Android Gradle Plugin Version: 4.1.3
Gradle Version: 6.5
GPG: Gpg4win-3.1.15
Step2:提交Issue
如果想要往Maven Central上傳包,首先需要提交一個(gè)Issue進(jìn)行申請(qǐng)。
申請(qǐng)網(wǎng)址:https://issues.sonatype.org/secure/Dashboard.jspa
如果沒(méi)有賬號(hào),請(qǐng)先注冊(cè)一個(gè),這個(gè)賬號(hào)跟后續(xù)登錄maven倉(cāng)庫(kù)網(wǎng)站是一樣的,需要注意。
提交Issue需要選擇的類(lèi)型和填寫(xiě)的內(nèi)容如下圖紅框內(nèi)所示:

這里需要特別注意Group Id,因?yàn)檫@涉及到域名,需要你擁有這個(gè)域名的所有權(quán),不能隨便填寫(xiě),否則驗(yàn)證不通過(guò)。
如果沒(méi)有域名,你可以使用你在GitHub上注冊(cè)的賬號(hào),比如我這邊是github.com/ddnosh,那么我們申請(qǐng)的Group Id可以寫(xiě)成com.github.ddnosh。
提交了Issue后,系統(tǒng)會(huì)馬上給你發(fā)送一個(gè)comment,讓你對(duì)Group Id進(jìn)行驗(yàn)證,比如我們用的是GitHub網(wǎng)站的域名,系統(tǒng)讓我們?cè)谫~號(hào)下新建一個(gè)項(xiàng)目以便驗(yàn)證這個(gè)Group Id是你的:

如果是其它域名的話(huà),需要在域名下進(jìn)行驗(yàn)證,具體參考系統(tǒng)給你發(fā)的Comment。
我們?cè)贕itHub上創(chuàng)建好這個(gè)項(xiàng)目后,在這個(gè)Issue下面留言讓它們?nèi)z測(cè),系統(tǒng)如果檢測(cè)成功,會(huì)發(fā)送如下信息:

這樣我們就有權(quán)限去上傳包了,下一步我們介紹如何上傳包。
Step3:配置
官網(wǎng)也有介紹如何通過(guò)gradle上傳包的,參考如下文章:
https://central.sonatype.org/pages/gradle.html
不過(guò)我們今天介紹通過(guò)第三方的插件:Gradle Nexus Staging,進(jìn)行上傳。
下面就介紹下配置的一些信息。
首先,在項(xiàng)目根目錄的build.gradle中添加apply:
apply plugin: ‘io.codearte.nexus-staging’
然后在dependencies中添加兩個(gè)classpath:
classpath ‘com.github.dcendents:android-maven-gradle-plugin:2.1’
classpath
‘io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.30.0’
接下來(lái)在項(xiàng)目的根目錄下添加一個(gè)專(zhuān)門(mén)用于上傳的gradle腳本,這里我們叫做publish-mavencentral.gradle,這是一個(gè)模板,可以直接拿來(lái)用,可以直接點(diǎn)擊查看:publish-mavencentral.gradle
可以看到publish-mavencentral.gradle腳本里面有一些參數(shù)需要設(shè)定的,那么我們下面就是要定義這些參數(shù),為了安全起見(jiàn),這些參數(shù)我們?nèi)慷x在local.properties中:
signing.keyId=AAAAAAAA
signing.password=123
signing.secretKeyRingFile=C:/android/xxx.gpg
##nexus賬號(hào)信息,也就是創(chuàng)建工單時(shí)的賬號(hào)和密碼
ossrhUsername=xxx
ossrhPassword=456
后面的工作就是看看這5個(gè)參數(shù)如何設(shè)定的:
ossrhUsername和ossrhPassword很簡(jiǎn)單,就是我們?cè)凇維tep2:提交Issue】中注冊(cè)的用戶(hù)名和密碼。
signing相關(guān)的3個(gè)參數(shù)是跟我們包的簽名相關(guān)的,這里我們使用gpg4win,官網(wǎng)下載地址:https://www.gpg4win.org/index.html
接下來(lái)我們就介紹下signing.keyId、signing.password、signing.secretKeyRingFile是怎么定義的。
生成密鑰對(duì)
gpg --gen-key

signing.keyId我們只需要取最后的8位;
signing.password就是我們?cè)谏擅荑€對(duì)過(guò)程中要求我們輸入的;
如果需要查看keyId,可以輸入如下命令:
gpg --list-key
signing.secretKeyRingFile
這個(gè)文件到底是什么文件呢?其實(shí)它就是gpg key的secret。
那么怎么獲取呢?很簡(jiǎn)單,打開(kāi)安裝好的Gpg4win軟件,這里名字叫做Kleopatra:

右鍵,選擇Backup Secret Keys…,保存為gpg格式的文件,然后這個(gè)文件的路徑就是signing.secretKeyRingFile的值。
另外關(guān)于publish-mavencentral.gradle中的sdk包的版本號(hào),我們可以統(tǒng)一定義在根目錄的build.gradle文件的buildscript節(jié)點(diǎn)下,我們定義一個(gè)ext子節(jié)點(diǎn):
ext {
versionName = '1.0.0'
versionCode = 1
kotlin_version = '1.4.31'
}
versionName就是sdk的版本號(hào),需要注意的是,如果versionName以SNAPSHOT結(jié)尾的話(huà),則會(huì)上傳到snapshot的服務(wù)器中。
Step4:上傳包(jar/aar)
經(jīng)過(guò)上面的準(zhǔn)備工作,我們接下來(lái)就進(jìn)入到激動(dòng)人心的時(shí)刻了,將我們的包上傳到Maven倉(cāng)庫(kù),是不是很心動(dòng)呢?
打開(kāi)Android Studio右上角的Gradle,選擇圖示的publish,雙擊運(yùn)行即可。

我們登錄:https://s01.oss.sonatype.org/,賬號(hào)密碼就是我們注冊(cè)Issue時(shí)的賬號(hào)密碼。
我們選擇左側(cè)的Staging Repositories,可以看到我們剛剛上傳的包:

我們選中自己的包,然后點(diǎn)擊"Close"按鈕:

然后系統(tǒng)會(huì)幫我們對(duì)包進(jìn)行一系列的檢測(cè)工作,我們看到有一個(gè)錯(cuò)誤:
Failed: Signature Validation
意思是包簽名出錯(cuò)。原來(lái)我們本地用Gpg4win生成的密鑰對(duì),沒(méi)有將公鑰上傳到官網(wǎng)驗(yàn)證包指定的服務(wù)器地址,通過(guò)右側(cè)的日志我們也可以看到,系統(tǒng)對(duì)一些可以上傳公鑰的服務(wù)器進(jìn)行驗(yàn)證時(shí)沒(méi)有發(fā)現(xiàn)我們上傳的公鑰,于是就報(bào)錯(cuò)了。
解決方案也很簡(jiǎn)單,就是從右側(cè)選一個(gè)服務(wù)器地址,將我們本地生成的公鑰上傳上去即可。
上傳的命令如下:
gpg --keyserver http://keys.openpgp.org:11371 --send-keys xxxxxxxx
公鑰也是要最后8位即可。

再次點(diǎn)擊"Close"后可以看到,一系列的驗(yàn)證成功了。
然后我們點(diǎn)擊"Release"按鈕,將包正式地發(fā)布出去:

包發(fā)布后,并不能馬上在Maven倉(cāng)庫(kù)看到,同樣需要審核。
你會(huì)發(fā)現(xiàn)在原先的Issue里多了一個(gè)系統(tǒng)發(fā)送的Comment:

也就是你在https://s01.oss.sonatype.org/中過(guò)個(gè)幾分鐘就可以搜到你的包,如圖的方式:

但是要在真正的Maven倉(cāng)庫(kù)(也就是通過(guò)implementation方式引入的庫(kù)),還需要等待差不多2個(gè)小時(shí)。
到時(shí)候你可以通過(guò)https://search.maven.org/查詢(xún)你的包,看看是否能查詢(xún)到,比如通過(guò)包名的方式:

好了,把包上傳到Maven Central的方法介紹完成!!!
3. 一些注意事項(xiàng)
1. publish
雙擊"publish"準(zhǔn)備上傳包的時(shí)候,腳本會(huì)到工程的build\outputs目錄下尋找包,而且是"-release"結(jié)尾的包:

這個(gè)在"publish-mavencentral.gradle"腳本中有寫(xiě):

所以我們?nèi)绻蟼餍碌陌_的步驟是先把sdk工程下的build目錄刪除,然后通過(guò)gradle腳本的assembleRelease重新打包release的包:

release包打出來(lái)后再通過(guò)publish腳本上傳。
2. 刪除Maven Central已上傳的包
目前來(lái)說(shuō)網(wǎng)站沒(méi)有提供直接的方法刪除,國(guó)民程序員想到的方法有兩個(gè):
(1) 通過(guò)Issue告訴管理者幫忙刪除
(2) 重新發(fā)布一個(gè)versionName更高的版本
關(guān)于刪除Maven Central包更多的討論,可以參考stackoverflow上的議題:
https://stackoverflow.com/questions/9789611/removing-an-artifact-from-maven-central
4:示例工程
https://github.com/ddnosh/ARabbit
工程里面有上述所有的操作步驟和文件,可以作為參考。







