掘金遷移地址
前言
最近寫了一個自動化打包上傳到蒲公英等三方平臺,在飛書的群機器人中發送消息,解放雙手,方便測試人員下載
的項目,想發布到遠程服務器供方便調用,但是記得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注冊賬號,界面如圖:
填寫郵箱、用戶名、密碼信息即可注冊成功
注意:郵箱很重要,建議是你常用的郵箱,以便及時收到
Sonatype
在issue
中的答復。
注冊成功后再次回到登錄頁面,填寫剛才注冊的用戶名和密碼即可在Sonatype完成登陸,如下圖。
注冊需要填寫郵箱(重要,請填寫真實的郵箱)、名字、用戶名(重要,用于登錄)、密碼(需要含符號、英文和數字的復雜密碼),和驗證碼完成注冊。
創建問題
按照圖中所示,我們創建一個問題。
該步驟中唯一需要注意的地方就是 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。
管理員回復我的如下圖:
當該問題狀態變為已解決,則證明我們sonatype項目已經完成了申請,如下圖
第二步·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秘鑰
- https://www.gnupg.org/download/,從這里下載并安裝GPG客戶端,我的是mac,所以選擇如下框中的,點擊下一步安裝即可。如下圖
- 安裝成功后,打開終端,在命令行中執行命令
gpg --full-gen-key
,注意,一定要在命令行中執行命令,不能在客戶端界面做。
如上圖,加密方式選擇RSA and RSA,長度輸入4096,過期時間直接回車不用管,然后輸入一個user ID并且提供一個郵箱,我直接用的我sonatype的用戶名和郵箱。最后一步輸入'O',表示OK。
之后會彈出一個對話框,讓輸入密碼。
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位。
- 接下來創建secring.gpg文件,命令行執行
gpg --export-secret-keys -o secring.gpg
,這會要求你輸入在步驟4中設置的密碼,在你項目根目錄下會出現secring.gpg文件。因我我是在當前項目目錄下執行,所以secring.gpg文件生成在項目根目錄下。如下圖:
- 回到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,先后執行以下兩個任務。
按照上述這么多配置之后,不出意外打包和上傳都將成功[如有編譯失敗,請再翻翻上述文章]
上傳成功后,打開Nexus Repository Manager,登錄你的sonatype賬號,在左側Staging Repositories
頁面找到你的group id,選中,點擊上邊的close,等待幾分鐘十幾分鐘后刷新狀態,等其狀態變為closed后,再點擊Release,則所有人都用使用你的庫了。
備注: 最好是登陸
https://s01.oss.sonatype.org
,https://oss.sonatype.org
親測無法登陸,原因請看:https://issues.sonatype.org/browse/OSSRH-65499
接下來,需要等待一段時間,待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