Android庫發布到Maven Central超詳細攻略

掘金遷移地址

前言

最近寫了一個自動化打包上傳到蒲公英等三方平臺,在飛書的群機器人中發送消息,解放雙手,方便測試人員下載的項目,想發布到遠程服務器供方便調用,但是記得JCenter已經宣布在2020年5月1日,停止新的庫的提交(只能使用,不能再提交),在2022年2月21號以前,連庫的解析服務也停止,所以,嘗試將打包庫發布到maven central上。

需要哪些工具

1: sonatype

2: nexus

3: Github

第一步 · Sonatype Jira配置

與jCenter一樣,Maven Central是由sonatype運營的,那么首先需要去注冊一個sonatype的賬號并獲得倉庫使用許可。

注冊

首先需要到issues.sonatype.org注冊賬號,界面如圖:

04E02CD9-6E13-44CC-9CC7-B5B02EC91430.png

填寫郵箱、用戶名、密碼信息即可注冊成功

注意:郵箱很重要,建議是你常用的郵箱,以便及時收到 Sonatypeissue 中的答復。

注冊成功后再次回到登錄頁面,填寫剛才注冊的用戶名和密碼即可在Sonatype完成登陸,如下圖。

4A0B9BBB-8A8C-4FAA-ADDF-D5D81D6CB15E.png

注冊需要填寫郵箱(重要,請填寫真實的郵箱)、名字、用戶名(重要,用于登錄)、密碼(需要含符號、英文和數字的復雜密碼),和驗證碼完成注冊。

創建問題

按照圖中所示,我們創建一個問題。

79104820-340E-47C6-B82D-53447DCD7C3A.png

該步驟中唯一需要注意的地方就是 Group Id,填寫錯sonatype工作人員會給你提一個issue,有兩種情況:

  • 無網站域名:使用 github 的子域名 io.github.username,比如我的 github 賬號名是 Eegets,那么可以填寫 io.github.eegets
  • 有網站域名:可以填寫個人或公司域名,比如:com.eegets,另外,還需要在 DNS 配置中配置一個 TXT 記錄來驗證域名所有權,具體請看:central.sonatype.org/pages/produ…

創建以后,會有管理員處理你的這個issue,等待管理員回復你的issue,一般需要設置一步:在github上創建一個空的倉庫,我的空倉庫名為:OSSRH-75861。第二就是是否要修改groupId。

管理員回復我的如下圖:

DD293434-2C4D-41D5-9758-212923BEBB12.png

當該問題狀態變為已解決,則證明我們sonatype項目已經完成了申請,如下圖

5E17FDBF-A9A3-442D-8A57-FBF1AA6AE47E.png

第二步·Gradle配置

接下來打開你的項目,在項目根目錄創建一個后綴為.gradle的文件「我創建的文件名為:publish-mavencentral.gradle」,如下:

該文件是通用的文件配置,直接copy修改里邊的一些配置項即可

apply plugin: 'maven-publish'
apply plugin: 'signing'

task androidSourcesJar(type: Jar) {
    classifier = 'sources'

    exclude "**/R.class"  //排除`R.class`
    exclude "**/BuildConfig.class"  //排除`BuildConfig.class`
}
//第 1 處
ext["signing.keyId"] = '' //簽名的密鑰后8位
ext["signing.password"] = ''  //簽名設置的密碼
ext["signing.secretKeyRingFile"] = '' //生成的secring.gpg文件目錄
ext["ossrhUsername"] = ''  //sonatype用戶名
ext["ossrhPassword"] = ''  //sonatype密碼

File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
    println "Found secret props file, loading props"
    Properties p = new Properties()
    p.load(new FileInputStream(secretPropsFile))
    p.each { name, value ->
        ext[name] = value
    }
} else {
    println "No props file, loading env vars"
}
publishing {
    publications {
        release(MavenPublication) {
            println("publish-maven Log-------> PUBLISH_GROUP_ID: $PUBLISH_GROUP_ID; PUBLISH_ARTIFACT_ID: $PUBLISH_ARTIFACT_ID; PUBLISH_VERSION: $PUBLISH_VERSION")
            // The coordinates of the library, being set from variables that
            
            //第 2 處
            groupId PUBLISH_GROUP_ID
            artifactId PUBLISH_ARTIFACT_ID
            version PUBLISH_VERSION

            // Two artifacts, the `aar` and the sources
            artifact("../plugin/com/eegets/plugin/upload/${PUBLISH_VERSION}/upload-${PUBLISH_VERSION}.jar")
            artifact androidSourcesJar

            // Self-explanatory metadata for the most part
            pom {        
                //第 3 處
                name = PUBLISH_ARTIFACT_ID
                description = '自動化打包上傳到蒲公英等三方平臺,解放雙手,方便測試人員下載' //項目描述
                // If your project has a dedicated site, use its URL here
                url = 'https://github.com/eegets/UploadApkPlugin' //項目github鏈接
                licenses {
                    license {
                        //協議類型,一般默認Apache License2.0的話不用改:
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        //第 4 處
                        id = 'xxx' //你的sonatype用戶名
                        name = 'xxx' //你的sonatype用戶名
                        email = 'xxx' //你的sonatype注冊郵箱
                    }
                }
                // Version control info, if you're using GitHub, follow the format as seen here
                scm {
                    //第 5 處
                    //修改成你的Git地址:
                    connection = 'scm:git@github.com:eegets/UploadApkPlugin.git'
                    developerConnection = 'scm:git@github.com:eegets/UploadApkPlugin.git'
                    //分支地址:
                    url = 'https://github.com/eegets/UploadApkPlugin/tree/master'
                }
                // A slightly hacky fix so that your POM will include any transitive dependencies
                // that your library builds upon
                withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')

                    project.configurations.implementation.allDependencies.each {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }
                }
            }
        }
    }
    repositories {
        // The repository to publish to, Sonatype/MavenCentral
        maven {
            //第 6 處
            name = "UploadApkPlugin"
            //此處用'https://s01.oss.sonatype.org'替代'https://oss.sonatype.org',因為`https://oss.sonatype.org`會出現nexus后臺無法登陸以及發布出現`Received status code 403 from server: Forbidden`問題
            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            // You only need this if you want to publish snapshots, otherwise just set the URL
            // to the release repo directly
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

            // The username and password we've fetched earlier
            credentials {
                username ossrhUsername
                password ossrhPassword
            }
        }
    }
}
signing {
    sign publishing.publications
}

如上述代碼,我們需要配置 6

第 1 處

在項目的根目錄local.properties文件中增加如下配置

#//剛才獲取的秘鑰后8位
signing.keyId=XXXX

#//步驟4中設置的密碼
signing.password=XXXX

#//生成的secring.gpg文件目錄
signing.secretKeyRingFile=/Users/xxxx/xxxx/secring.gpg

#//sonatype用戶名
ossrhUsername=xxxx

#//sonatype密碼
ossrhPassword=xxxx

第 2 處

在要提交的module下的build.gradle文件中,添加如下代碼:

注意:此處的ext{}apply from: '../publish-mavencentral.gradle'順序一定不能亂,必須是先ext,再apply from

ext {
    PUBLISH_ARTIFACT_ID = "uploadPlugin" //你的artifact_id,一般是module的名字
    PUBLISH_VERSION = "1.0.3"  //發布版本號
    PUBLISH_GROUP_ID = 'xxx'  //你的sonatype的group_id
}
apply from: '../publish-mavencentral.gradle'

第 3 處

publish-mavencentral.gradle配置項目描述和項目GitHub地址,如下:

name = PUBLISH_ARTIFACT_ID description = '項目描述' //項目描述

url = 'https://github.com/eegets/UploadApkPlugin' //項目github鏈接

第 4 處

配置sonatype的信息,如下:

id = 'xxx' //你的sonatype用戶名 
name = 'xxx' //你的sonatype用戶名 
email = 'xxx' //你的sonatype注冊郵箱

第 5 處

配置github信息,如下:


connection = 'scm:git@github.com:eegets/UploadApkPlugin.git'  //分支地址

developerConnection = 'scm:git@github.com:eegets/UploadApkPlugin.git' //分支地址: 

url = 'https://github.com/eegets/UploadApkPlugin/tree/master'

第 6 處

配置項目名稱和發布地址

name = "UploadApkPlugin" 

releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" def 

snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"

注意:此處用https://s01.oss.sonatype.org 替代 https://oss.sonatype.org ,因為https://oss.sonatype.org會出現nexus后臺無法登陸以及發布出現Received status code 403 from server: Forbidden問題

創建GPG秘鑰

  1. https://www.gnupg.org/download/,從這里下載并安裝GPG客戶端,我的是mac,所以選擇如下框中的,點擊下一步安裝即可。如下圖
E56F12AC-2F2E-4AB3-9DDE-508108C35DEA.png
  1. 安裝成功后,打開終端,在命令行中執行命令gpg --full-gen-key,注意,一定要在命令行中執行命令,不能在客戶端界面做。
image.png
  1. 如上圖,加密方式選擇RSA and RSA,長度輸入4096,過期時間直接回車不用管,然后輸入一個user ID并且提供一個郵箱,我直接用的我sonatype的用戶名和郵箱。最后一步輸入'O',表示OK。

  2. 之后會彈出一個對話框,讓輸入密碼。

image.png

gpg: revocation certificate stored as '~/.gnupg/openpgp-revocs.d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXE478F7CC.rev' public and secret key created and signed.

pub rsa4096 2021-03-22 [SC] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEE478F7CC uid boybeak boybeak@gmail.com sub rsa4096 2021-03-22 [E] ```

這會為你在~/.gnupg/openpgp-revocs.d/目錄下創建一個.rev文件,記住pub的末尾8位。

  1. 接下來創建secring.gpg文件,命令行執行gpg --export-secret-keys -o secring.gpg,這會要求你輸入在步驟4中設置的密碼,在你項目根目錄下會出現secring.gpg文件。因我我是在當前項目目錄下執行,所以secring.gpg文件生成在項目根目錄下。如下圖:
  1. 回到gpg客戶端,選擇我們剛生成的秘鑰條目,右鍵,選擇Send Public Key to Key Server。記住后邊八位,如下圖圈起來的八位:

做完以上gpg的配置之后我們就可以完善我們上邊第 1 步了。

local.properties配置

#//剛才獲取的秘鑰后8位
signing.keyId=XXXX

#//步驟4中設置的密碼
signing.password=XXXX

#//生成的secring.gpg文件目錄
signing.secretKeyRingFile=/Users/xxxx/xxxx/secring.gpg

#//sonatype用戶名
ossrhUsername=xxxx

#//sonatype密碼
ossrhPassword=xxxx

執行打包和上傳

設置完這些后,在AndroidStudio右側的gradle tasks中找到你想提交的module,先后執行以下兩個任務。

image.png

按照上述這么多配置之后,不出意外打包和上傳都將成功[如有編譯失敗,請再翻翻上述文章]

上傳成功后,打開Nexus Repository Manager,登錄你的sonatype賬號,在左側Staging Repositories頁面找到你的group id,選中,點擊上邊的close,等待幾分鐘十幾分鐘后刷新狀態,等其狀態變為closed后,再點擊Release,則所有人都用使用你的庫了。

備注: 最好是登陸https://s01.oss.sonatype.orghttps://oss.sonatype.org親測無法登陸,原因請看:https://issues.sonatype.org/browse/OSSRH-65499

image.png

接下來,需要等待一段時間,待Activity選項卡中出現對號的“Repository closed”即完成準備,然后點擊Release按鈕發布到MavenCentral,等待幾個小時后可以在 search.maven.org/ 查詢發布結果。

Missing: no javadoc jar found in folder解決辦法

按照上述方式我們就算完成了maven的打包和發布,如果在nexus最后執行Close的時候出現Close 失敗,并且報:Missing: no javadoc jar found in folder解決辦法,請移步我寫的另外一篇文章 Missing: no javadoc jar found in folder解決辦法,關于 Missing: no javadoc jar found in folder解決辦法的解決辦法

注意以上幾處引用的需要注意的地方,這些注意的地方可以祝你避坑!!!

源碼

https://github.com/eegets/UploadApkPlugin

參考資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容