最近在整理一個(gè)項(xiàng)目椭赋,希望能分享給人類抚岗。折騰老半天,終于獻(xiàn)出去了:
謹(jǐn)此此篇記錄我踩過的坑哪怔,以及如何爬出坑宣蔚。希望對(duì)讀者有所幫助。
電腦環(huán)境:
OS: Mac OS 10.14.4
IDE:Android Studio 3.5
GPG:2.2.8
步驟一:源碼準(zhǔn)備
在Android Studio中完成項(xiàng)目開發(fā)和測試认境,盡可能的保證您貢獻(xiàn)的項(xiàng)目好用耐用件已;
步驟二:向Sonatype提交工單
坑位預(yù)警:Group Id要求唯一
工單提交地址:https://issues.sonatype.org/secure/Dashboard.jspa
這是一個(gè)JIRA平臺(tái),如果沒有賬號(hào)元暴,則注冊(cè)一個(gè)。
注冊(cè)地址:https://issues.sonatype.org/secure/Signup!default.jspa
注冊(cè)成功之后兄猩,記下用戶名和密碼茉盏,在上傳jar到Nexus時(shí)要用到。
登錄Sonatype JIRA枢冤,并新建工單:
根據(jù)其提示填好對(duì)應(yīng)的內(nèi)容鸠姨,提交。
提交之后淹真,平臺(tái)會(huì)給你留言讶迁,還會(huì)有相應(yīng)的郵件通知。
告訴你哪里有問題或者接下來該怎么做核蘸。如圖所示:
如果有信息需要修改巍糯,比如要修改Group Id啸驯,改完之后點(diǎn)擊工單上方的“response”按鈕,以通知平臺(tái)已修改完畢祟峦,平臺(tái)會(huì)再次查驗(yàn)?zāi)愕男畔ⅰ?br> 直到平臺(tái)回復(fù)以下類似內(nèi)容:
至此罚斗,就可以進(jìn)行下一步,上傳jar包宅楞。
步驟三:上傳jar包
jar包通過gradle腳本上傳针姿。
在Android工程的根目錄下新建maven_push.gradle文件。
文件內(nèi)容如下:
apply plugin: 'maven'
apply plugin: 'signing'
def sonatypeRepositoryUrl
def isReleaseBuild() {
return VERSION_NAME.contains("SNAPSHOT") == false
}
if (isReleaseBuild()) {
println 'RELEASE BUILD'
sonatypeRepositoryUrl = hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: "https://oss.sonatype.org/service/local/staging/deploy/maven2"
} else {
println 'DEBUG BUILD'
sonatypeRepositoryUrl = hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: "https://oss.sonatype.org/content/repositories/snapshots"
}
def getRepositoryUsername() {
return hasProperty('nexusUsername') ? nexusUsername : ""
}
def getRepositoryPassword() {
return hasProperty('nexusPassword') ? nexusPassword : ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groudId = GROUP_ID
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: sonatypeRepositoryUrl) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
println 'Signing archives...'
sign configurations.archives
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.sourceFiles
options {
links "http://docs.oracle.com/javase/7/docs/api/"
linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
}
classpath += project.android.libraryVariants.toList().first().javaCompile.classpath
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
然后引用maven_push.gradle厌衙。
在library module的build.gradle文件的頭部或尾部添加:
apply from: '../maven_push.gradle'
步驟四:配置maven信息:
在根目錄的的gradle.properties文件中設(shè)置POM信息距淫,實(shí)例如下:
VERSION_NAME=1.0.2
VERSION_CODE=2
GROUP_ID=com.github.2ndlines
POM_DESCRIPTION=Android Download Library
POM_URL=https://github.com/2ndLines/XDownloadManager
POM_SCM_URL=https://github.com/2ndLines/XDownloadManager
POM_SCM_CONNECTION=scm:git@github.com:2ndLines/XDownloadManager.git
POM_SCM_DEV_CONNECTION=scm:git@github.com:2ndLines/XDownloadManager.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=Apache 2.0
POM_DEVELOPER_ID=[your id]
POM_DEVELOPER_NAME=[your name]
POM_NAME=Download library
POM_ARTIFACT_ID=download
POM_PACKAGING=aar
WEB_SITE_URL=https://github.com/2ndLines/XDownloadManager
ISSUE_TRACKER_URL=https://github.com/2ndLines/XDownloadManager/issues
VCS_URL=https://github.com/2ndLines/XDownloadManager.git
RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2
SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots
配置信息中的VERSION_NAME
如果包含SNAPSHOT,如1.0.2-SNAPSHOT婶希,表示上傳快照版本榕暇,否則表示上傳正式版本。
其中的私有信息請(qǐng)?zhí)鎿Q成你個(gè)人的饲趋。
配置GPG信息拐揭,用于簽署上傳的jar或aar文件
如果沒有安裝gpg,請(qǐng)先進(jìn)行安裝奕塑。
$ brew install gpg
生成密鑰對(duì)(記住簽名密碼堂污,后面要用):
$ gpg --gen-key
查看公鑰Id:
$ gpg --list-key --keyid-format short
例如:
pub rsa2048/F7D94EDD 2019-11-08 [SC] [有效至:2021-11-07]
,
rsa2048
后面的F7D94EDD
就是公鑰Id。
上傳公鑰Id到公網(wǎng):
gpg --keyserver hkp://pgp.mit.edu --send-keys [your_pubkey_id]
生成密鑰環(huán)文件:
$gpg --export-secret-keys -o ~/.gnupg/secring.gpg
如果有多套密鑰對(duì)龄砰,則可通過指定uid來導(dǎo)出指定的密鑰盟猖。例如:
$gpg --export-secret-keys -o ~/.gnupg/secring.gpg [your_email@your_domain.com]
配置gpg信息:
##gpg信息
signing.keyId=[your_pubkey_id]
signing.password=[your_signing_password]
signing.secretKeyRingFile=/Users/[your_username]/.gnupg/secring.gpg
##nexus賬號(hào)信息,也就是創(chuàng)建工單時(shí)的賬號(hào)和密碼
nexusUsername=[your_sonatype_account]
nexusPassword=[your_sonatype_password]
至此换棚,就可以通過gradle腳本上傳jar到sonatype nexus式镐。
進(jìn)入Android Studio工程,打開terminal固蚤,
$ ./gradlew uploadArchives
指令執(zhí)行成功娘汞,表示上傳成功。
步驟五:驗(yàn)證jar夕玩,提交審核
完成上一步之后你弦,登錄sonatype nexus進(jìn)行查看,登錄賬號(hào)跟創(chuàng)建工單時(shí)注冊(cè)的賬號(hào)一致燎孟。
- 如果
VERSION_NAME
中包含SNAPSHOT
禽作,則表示上傳的是快照版本,查看位置為:
按groudId路徑搜索你的jar時(shí)揩页,可能需要等1分鐘左右旷偿,視網(wǎng)絡(luò)而定,切莫急躁。 - 如果
VERSION_NAME
中不包含SNAPSHOT
萍程,則表示上傳正式版本幢妄。查看路徑為:
選中上傳的文件,然后點(diǎn)擊“close”按鈕尘喝,然后查看下方的activity欄磁浇,看看是否有驗(yàn)證錯(cuò)誤,如果沒有朽褪,則點(diǎn)擊“release”按鈕置吓,并到工單下留言。如果有缔赠,可到下方留言衍锚,或自行擺渡解決。
工單留言實(shí)例如下圖所示:
我在驗(yàn)證release版本時(shí)遇到的坑:
-
failed:signature validation. 簽名驗(yàn)證失敗嗤堰,提示信息說缺失*.asc文件戴质。因?yàn)槲以谂渲胓pg信息時(shí)沒有配置
signing.secretKeyRingFile
。因?yàn)槲矣玫膅pg版本高于2.1踢匣, 不會(huì)自行產(chǎn)生secring.gpg文件告匠。
failed:POM validation. POM文件驗(yàn)證失敗。因?yàn)閙aven_push.gradle和POM配置信息是從網(wǎng)上找的离唬。剛開始找了一些缺胳膊少腿的后专。坑笆漭骸F莅ァ!
-
我剛把release包上傳到nexus嫂用,就跑去給Sonatype JIRA留言型凳,結(jié)果人家提示我說:
所以我在文章中給出的步驟是jar提交nexus,然后自行查看驗(yàn)證結(jié)果無誤之后再到JIRA留言嘱函,以免浪費(fèi)時(shí)間甘畅。
另外,至于為什么是不包含
SNAPSHOT
則為正式版本往弓,因?yàn)?code>maven_push.gradle腳本函數(shù)中是這么設(shè)定的橄浓。也是約定俗成的。
到工單下留言之后亮航,Sonatype JIRA會(huì)進(jìn)行最后審核,通過之后匀们,會(huì)收到類似如下留言:
愉快的等待2個(gè)小時(shí)后缴淋,到Sonatype中央庫搜索你的jar。如果能搜到,則表示已審核通過重抖,成功進(jìn)入maven中央庫露氮。恭喜你!钟沛!
以后就可以愉快地“close”和“release”了畔规。
測試你發(fā)布到中央庫的jar
在module的build.gradle中添加庫依賴,例如:
...
dependencies {
//your other dependencies
implementation 'com.github.2ndlines:download:1.0.3-SNAPSHOT'
}
...
- 如果是快照版本恨统,在根build.gradle中添加maven庫快照地址:
...
allprojects {
repositories {
...
maven { url 'https://oss.sonatype.org/content/repositories/snapshots'}
}
}
...
- 如果是正式版本叁扫,則在根build.gradle中添加maven庫地址:
...
allprojects {
repositories {
...
mavenCentral()
}
}
...
其實(shí),上傳jar中遇到坑都不算坑畜埋,真正的坑是jar包里的坑莫绣。哈哈哈~
最后,希望更新開發(fā)者加入開源陣營悠鞍,齊力帶飛中國的軟件開源工程对室,在開源排行榜上多一些國人的面孔和組織。加油?Ъ馈掩宜!