- 發(fā)布項(xiàng)目至JCenter(Bintray)報(bào)錯(cuò)或版本更新失敗等問(wèn)題請(qǐng)前往發(fā)布項(xiàng)目到Maven(JCenter)遇到的錯(cuò)誤解決辦法
寫在前面:
? ? 之前在寫項(xiàng)目時(shí)瘪松,喜歡將重復(fù)的功能或者自定義控件封裝到公用的模塊中围小,方便其他項(xiàng)目共用。當(dāng)項(xiàng)目越來(lái)越多酣衷,很多項(xiàng)目都依賴了這個(gè)公用模塊時(shí)交惯,其中某一個(gè)項(xiàng)目中對(duì)公用模塊中的代碼進(jìn)行了修改,此時(shí)其他依賴該公共模塊的項(xiàng)目不得不做出修改或者同步代碼,是不是相當(dāng)麻煩席爽?因此就不得不將公用模塊打包成.aar文件(不清楚.aar文件的童鞋請(qǐng)自行Google或Baidu)意荤,公開(kāi)或放在私服提供給各個(gè)項(xiàng)目使用。這里我們就隨著前輩們的腳步來(lái)學(xué)習(xí)如何將項(xiàng)目模塊發(fā)布至Maven倉(cāng)庫(kù)只锻。真正做到只需一處修改玖像,四處升級(jí)即可。本文將介紹發(fā)布到Maven的三種方式齐饮。最終將項(xiàng)目發(fā)布遠(yuǎn)程Maven倉(cāng)庫(kù)后添加至JCenter捐寥,供其他人使用你的公共庫(kù)。
1:Maven的定義:
簡(jiǎn)單來(lái)說(shuō)祖驱,Maven是項(xiàng)目(Software Project)管理工具握恳。對(duì)于maven來(lái)說(shuō),一個(gè)軟件工程的唯一標(biāo)識(shí)是由開(kāi)發(fā)者(groupId)羹膳、生成物(artifactId)睡互、版本(version) 共同決定的。每個(gè)工程都有一個(gè)打包類型陵像,可以是jar, aar,war, ear 或 pom就珠,打包類型決定了工程最終產(chǎn)物的類型,其中pom類型用于構(gòu)件多模塊工程醒颖。其內(nèi)部工作機(jī)制是通過(guò)解析pom.xml文件中的配置獲取jar包或aar資源地址自動(dòng)將資源download到Peoject中妻怎,省去了手動(dòng)下載到本地的繁瑣過(guò)程。
2:Maven的存儲(chǔ)位置:
遠(yuǎn)程Maven倉(cāng)庫(kù)是存儲(chǔ)服務(wù)器的物理空間上泞歉,本文介紹是將Maven發(fā)布到第三方OSS服務(wù)商Bintray的存儲(chǔ)空間上逼侦。
發(fā)布代碼到Maven的三種方式
一:發(fā)布到本地Maven
1:uploadArchives配置和Task生成
在要發(fā)布的模塊build.gradle中配置uploadArchives屬性,示例代碼:
//添加這一行腰耙,告訴gradle應(yīng)用到項(xiàng)目中
apply plugin: 'maven'
//配置模塊未本地Maven倉(cāng)庫(kù)
uploadArchives{
repositories.mavenDeployer{
// 配置本地倉(cāng)庫(kù)路徑榛丢,這里是項(xiàng)目的根目錄下的maven目錄中
repository(url: uri('../maven'))
// 唯一標(biāo)識(shí) 一般為模塊包名 也可其他
pom.groupId = "com.android.imusic.player.lib"
// 項(xiàng)目名稱(一般為模塊名稱 也可其他
pom.artifactId = "music-player-lib"
// 發(fā)布的版本號(hào)
pom.version = "1.0.0"
}
}
配置后Sync Now一把,Studio編輯器右上角Gradle中你要發(fā)布的模塊下會(huì)多出一個(gè)upload目錄挺庞,目錄中有個(gè)uploadArchives任務(wù)腳本晰赞,這個(gè)腳本就是將庫(kù)發(fā)布到本地或私服Maven倉(cāng)庫(kù)的Task。
2:執(zhí)行uploadArchives任務(wù)
點(diǎn)擊如圖所示的uploadArchives
uploadArchives有兩種運(yùn)行方法:1:雙擊運(yùn)行选侨。2:在AndroidStudio自帶的Terminal中執(zhí)行 gradlew uploadArchives 命令運(yùn)行掖鱼。根據(jù)喜好選取一種即可,開(kāi)始任務(wù)后等待編譯完成援制。
編譯完成后在你項(xiàng)目的根目錄會(huì)生成一個(gè)maven目錄戏挡,在目錄maven->com.android.imusic.ib->music-player-lib->1.0.0中會(huì)有個(gè)music-player-lib.aar 文件,這個(gè)文件就是打包簽名好的庫(kù)文件晨仑。
3:應(yīng)用music-player-lib.aar庫(kù)文件到項(xiàng)目中
- 3.1:項(xiàng)目根目錄build.gradle配置Maven
在你的項(xiàng)目中根目錄下的build.gradle中配置如下代碼:
allprojects {
repositories {
google()
jcenter()
//本地Maven倉(cāng)庫(kù)地址,取決于你的磁盤目錄
maven {
url 'file://D://AndroidStudioProjects//IMusic//maven'
}
}
}
- 3.2:app中的build.gradle配置
在你想要依賴.aar的模塊中的build.gradle中配置如下代碼:
//應(yīng)用這個(gè)依賴,這里填寫剛才配置的包名+庫(kù)名
implementation 'com.android.imusic.lib:music-player-lib:1.0.0'
- 或者你可以不配置本地倉(cāng)庫(kù)褐墅,直接將.aar文件復(fù)制到你的app模塊中直接使用拆檬,配置代碼如下:
//在你的app中的build.gradle中配置
android {
repositories {
flatDir {
dirs 'libs'
}
}
}
//添加依賴
implementation(name: 'music-player-lib-1.0.0', ext: 'aar')
點(diǎn)擊Sync Now等待完成后發(fā)布依賴到本地Maven就成功啦!在發(fā)布到本地Maven前你應(yīng)該要校驗(yàn)混淆開(kāi)啟的情況噢~免得他人依賴你的項(xiàng)目時(shí)掉坑里去了掌栅。發(fā)布到本地Maven固然方便秩仆,但是公司項(xiàng)目團(tuán)隊(duì)人數(shù)較多時(shí),將模塊打包成.aar文件后復(fù)制到項(xiàng)目多少有點(diǎn)不方便猾封,比如所A程序員的本地Maven路徑是在D盤澄耍,而B(niǎo)程序員的Maven路徑又在E盤,這樣同步代碼改來(lái)改去著實(shí)難受晌缘,所以接下來(lái)就介紹適應(yīng)公司內(nèi)部團(tuán)隊(duì)多人開(kāi)發(fā)的場(chǎng)景齐莲,即將代碼發(fā)布至局域網(wǎng)倉(cāng)庫(kù)。
二:發(fā)布到局域網(wǎng)Maven
局域網(wǎng)部署需要用到私服部署磷箕,這里跟隨前輩腳步介紹使用Nexus來(lái)搭建部署局域網(wǎng)Maven倉(cāng)庫(kù)选酗。
1:安裝部署Nexus(這里用nexus-2.14.2-01版本演示)
點(diǎn)此前往下載nexus-2.14.2-01
下載解壓后會(huì)看到目錄下下面幾個(gè)文件夾
目錄下批處理腳本釋義:
console-nexus.bat--->常規(guī)安裝Nexus服務(wù)
install-nexus--->啟動(dòng)開(kāi)機(jī)自啟動(dòng)Nexus服務(wù)
start-nexus.bat--->啟動(dòng)Nexus服務(wù)
stop-nexus.bat--->停止Nexus服務(wù)
uninstall-nexus.bat--->卸載Nexus組件
wrapper.exe--->桌面程序
- 鼠標(biāo)右鍵"console-nexus.bat"以管理員身份運(yùn)行,等待CMD創(chuàng)建安裝完成后在瀏覽器輸入:http://localhost:8081/nexus岳枷。
安裝和成功啟動(dòng)后是這樣的
Nexus啟動(dòng)默認(rèn)界面圖示
2:Nexus倉(cāng)庫(kù)配置
-
2.1:點(diǎn)擊右上角Log In芒填,登錄默認(rèn)賬號(hào),默認(rèn)賬號(hào):admin 密碼:admin123
Maven登錄圖示 -
2.2:修改默認(rèn)密碼
Maven賬號(hào)默認(rèn)密碼修改圖示
按照步驟修改密碼即可,如果需要修改默認(rèn)的端口號(hào),修根目錄下的conf-nexus.properties文件中的application-port=8081一欄空繁,將8081替換你指定的端口號(hào):殿衰、
Nexus端口號(hào)修改圖示
配置就緒后,準(zhǔn)備發(fā)布盛泡,發(fā)布后你的項(xiàng)目路徑如圖所示:
Nexus項(xiàng)目存儲(chǔ)Maven管理目錄
3:準(zhǔn)備發(fā)布
- 3.1:模塊的build.gradle配置
apply plugin: 'com.android.library'
//應(yīng)用到Maven
apply plugin: 'maven'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
//打包main目錄下代碼和資源的 task
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
//配置需要上傳到maven倉(cāng)庫(kù)的文件
artifacts {
archives androidSourcesJar
}
//上傳到Maven倉(cāng)庫(kù)的task
uploadArchives {
repositories {
mavenDeployer {
//指定maven的倉(cāng)庫(kù)url闷祥,IP+端口+目錄
repository(url: "http://localhost:8081/nexus/content/repositories/releases/") {
//填寫你的Nexus的賬號(hào)密碼
authentication(userName: "admin", password: "123456")
}
// 唯一標(biāo)識(shí) 一般為模塊包名 也可其他
pom.groupId = "com.android.imusic.lib"
// 項(xiàng)目名稱(一般為模塊名稱 也可其他
pom.artifactId = "music-player-lib"
// 發(fā)布的版本號(hào)
pom.version = "1.0.0"
}
}
}
- 3.2:執(zhí)行uploadArchives,將項(xiàng)目發(fā)布到Nexus
執(zhí)行uploadArchives或者使用Studio自帶的Terminal中執(zhí)行 gradlew uploadArchives 命令開(kāi)始構(gòu)建運(yùn)行傲诵。等待結(jié)束后凯砍,瀏覽器打開(kāi)Nexus,查看Repositories->Releases 目錄拴竹。成功發(fā)布后的代碼庫(kù)模塊目錄如圖所示:
發(fā)布代碼到Nexus成功圖示
4:使用局域網(wǎng)Nexus存儲(chǔ)庫(kù)代碼庫(kù)
- 4.1:根build.gradle配置修改
在你的項(xiàng)目中的根build.gradle中添加如下代碼
allprojects {
repositories {
google()
jcenter()
//本地Maven倉(cāng)庫(kù)地址,取決于你的磁盤目錄
maven {
//這里本地不再使用悟衩,改用下面的局域網(wǎng)的路徑
//url 'file://D://AndroidStudioProjects//IMusic//maven',
//添加本地倉(cāng)庫(kù)URL
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
}
}
- 4.2:app模塊中build.gradle配置修改
在你的項(xiàng)目中要使用代碼庫(kù)的模塊中的build.gradle做如下修改:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//和剛才使用本地Maven倉(cāng)庫(kù)一致:包名+庫(kù)名
implementation 'com.android.imusic.lib:music-player-lib:1.0.0'
到此,發(fā)布代碼到本地倉(cāng)庫(kù)到此結(jié)束了栓拜。但是隨之又來(lái)了一個(gè)問(wèn)題局待,局域網(wǎng)倉(cāng)庫(kù)對(duì)公司團(tuán)隊(duì)來(lái)說(shuō)固然是好,但是你開(kāi)發(fā)的模塊很牛逼的時(shí)候菱属,別人要用你的模塊時(shí)怎么辦?這個(gè)時(shí)候就需要將模塊發(fā)布至外網(wǎng)倉(cāng)庫(kù)舰罚,即發(fā)布代碼至JCenter纽门。
三:發(fā)布到外網(wǎng)Maven
發(fā)布到外網(wǎng)Maven,本問(wèn)介紹發(fā)布到JCenter上营罢。在早期的AndroidStudio版本中赏陵,Google默認(rèn)使用的倉(cāng)庫(kù)是mavenCentral饼齿,但由于發(fā)布流程太復(fù)雜(前輩們是這樣分析的,不知道對(duì)不對(duì))蝙搔,后來(lái)改用默認(rèn)倉(cāng)庫(kù)是JCenter,說(shuō)了這么久還沒(méi)介紹JCenter是什么缕溉?簡(jiǎn)單來(lái)說(shuō)JCenter是Bintray其下的一個(gè)分區(qū)倉(cāng)庫(kù),代碼托管的存儲(chǔ)空間吃型。那既然JCenter是屬于Bintray旗下的证鸥,那就首先得從Bintray開(kāi)始。
1:Bintray賬號(hào)準(zhǔn)備
Bintray是一家OSS服務(wù)商勤晚,類似國(guó)內(nèi)的阿里云OSS枉层。要將代碼發(fā)布之JCenter,必須先有Bintray賬號(hào)和分區(qū)目錄赐写。感興趣可以去看下AndroidStudio的Bintray庫(kù)在Giuhub中的項(xiàng)目:Bintray-Github鸟蜡。注冊(cè)賬號(hào)我們注冊(cè)個(gè)人賬號(hào)即可。前往Bintray官網(wǎng)個(gè)人賬號(hào)注冊(cè)挺邀。
-
注意:1.注冊(cè)賬號(hào)最好注冊(cè)個(gè)人的揉忘,不然企業(yè)賬號(hào)沒(méi)有add To Jcenter功能,需要收費(fèi)端铛。2:注冊(cè)的郵箱一定要使用國(guó)外的郵箱泣矛,不然注冊(cè)沒(méi)反應(yīng)。
Bintray賬號(hào)注冊(cè)圖示
2:為Bintray賬號(hào)添加組織
添加組織有兩種方式:1:創(chuàng)建Bintray組織沦补。2:導(dǎo)入第三方托管平臺(tái)組織乳蓄。
2.1:創(chuàng)建Bintray組織
在bintray主頁(yè)鼠標(biāo)放至頭像彈窗的Menu框中點(diǎn)擊createOrganization->界面跳轉(zhuǎn)后點(diǎn)擊->Create new organization創(chuàng)建新的組織。
按照提示填寫組織基本信息提交即可夕膀。
2.2:導(dǎo)入第三方平臺(tái)組織
Bintray支持第三方托管平臺(tái)的組織導(dǎo)入虚倒,但目前為止只支持從Github導(dǎo)入組織到Bintray。
-
2.2.1:導(dǎo)入Github組織
在bintray主頁(yè)鼠標(biāo)放至頭像彈窗的Menu框中點(diǎn)擊createOrganization->再點(diǎn)擊Import from GitHub導(dǎo)入Github賬號(hào)組織产舞。第一次導(dǎo)入官方會(huì)給出操作流程圖魂奥,如下:
Bintray導(dǎo)入Github組織流程圖示 -
2.2.1.1 前往Github設(shè)置中心
點(diǎn)擊圖中標(biāo)記的Account Setting page,前往Github設(shè)置中心界面易猫。跳轉(zhuǎn)至Github的設(shè)置中心后依次點(diǎn)擊左側(cè)的Applications耻煤,展開(kāi)界面后點(diǎn)擊右側(cè)的Authorized OAuth Apps,展開(kāi)列表就可看到支持列表中有bintray了准颓。
授權(quán)設(shè)置及操作圖示 -
2.2.1.2 授權(quán)Bintray訪問(wèn)Github賬戶的權(quán)限
點(diǎn)擊Bintray一欄中的Grant哈蝇,授予Bintray訪問(wèn)Github賬戶的權(quán)限。
Github授權(quán)Bintray訪問(wèn)權(quán)限圖示 - 2.2.2:填寫第三方組織在Bintray中的基本信息
授予訪問(wèn)權(quán)限后攘已,再次走導(dǎo)入Github組織流程炮赦,選擇你的組織后,根據(jù)界面提示填寫基本信息提交即可样勃。
3:創(chuàng)建Bintray存儲(chǔ)分區(qū)
點(diǎn)擊Add New Repository創(chuàng)建存儲(chǔ)分區(qū)
按圖中所示吠勘,填寫分區(qū)基本信息
創(chuàng)建成功后是這樣的
4:模塊build.gradle配置
4.1:在你項(xiàng)目的根build.gradle中配置bintray環(huán)境依賴
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//添加bintray環(huán)境
classpath 'com.novoda:bintray-release:0.8.1'
}
}
4.2:在你要發(fā)布的模塊build.gradle中配置如下配置
apply plugin: 'com.novoda.bintray-release'
//推送到Bintray配置
publish {
//你的賬戶bintray下某個(gè)組織id
userOrg = 'xxxxxx'
//Maven倉(cāng)庫(kù)下庫(kù)的包名,一本與包名相同
groupId = 'xxx.xxx.xxx'
//項(xiàng)目名稱
artifactId = 'xxx'
//版本號(hào)
publishVersion = '1.0.0'
//項(xiàng)目介紹性芬,可以不寫
desc = 'xxx'
//項(xiàng)目主頁(yè),可以不寫
website = 'xxx'
}
最終的依賴地址是compile '倉(cāng)庫(kù)包名:項(xiàng)目名稱:版本號(hào)'
5:編譯并發(fā)布到Bintray
5.1:獲取Bintray API Key
在你的Bintray主頁(yè)點(diǎn)擊右上角頭像 右上角用戶名–>Edit Your Profile -> API Key –>輸入密碼–>Submit–>Show剧防。復(fù)制API key備用植锉。
5.2:運(yùn)行發(fā)布命令
在AndroidStudio編譯器自帶的Terminal中輸入命令:
gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
//BINTRAY_USERNAME替換為你的Bintray用戶名,BINTRAY_KEY替換為你剛才獲取的Bintray API KEY
//PdryRun釋義:false:編譯且將你的項(xiàng)目上傳至Bintray 峭拘,true:只是構(gòu)建你的項(xiàng)目俊庇,不會(huì)上傳
如果你在編譯中遇到問(wèn)題,請(qǐng)前往AndroidStudio發(fā)布項(xiàng)目到Bintray遇到的錯(cuò)誤及解決
開(kāi)始構(gòu)建后耐心等待棚唆,可能會(huì)因?yàn)閟ocket出現(xiàn)多次上傳失敗暇赤,重試即可。直到出現(xiàn)這個(gè)表示上傳成功宵凌。
上傳完成后可在你的主頁(yè)或者組織下查看
6:添加至JCenter
點(diǎn)擊右下角add to JCenter鞋囊,確認(rèn)后點(diǎn)擊send提交,等待審核通過(guò)瞎惫。(白天提交會(huì)到晚上才審核通過(guò)溜腐,因?yàn)橛袝r(shí)差,在他們上班時(shí)間提交瓜喇,會(huì)立即審核通過(guò))
send后挺益,等待審核通過(guò),通過(guò)后即可在外網(wǎng)使用你的庫(kù)作為依賴了乘寒。
這個(gè)是Bintray回復(fù)的站內(nèi)通知
7:項(xiàng)目引用JCenter庫(kù)
7.1未添加至JCenter引用:
- 7.1.1:在根build.gradle中配置如下代碼
allprojects {
repositories {
//bintray環(huán)境
maven { url 'https://dl.bintray.com/novoda-oss/snapshots/' }
//你的maven路徑
maven { url 'https://dl.bintray.com/你的id/maven' }
}
}
- 7.1.2:在app模塊中的build.gradle中配置如下代碼
dependencies {
//添加你的項(xiàng)目依賴地址,如下規(guī)則
implementation '倉(cāng)庫(kù)包名:項(xiàng)目名稱:版本號(hào)'
//例如我的:
//implementation 'com.imusic.player:music-player:1.0.0'
}
7.2:已添加至JCenter引用:
- 7.2.1:在根build.gradle中配置如下代碼
allprojects {
repositories {
//bintray環(huán)境
maven { url 'https://dl.bintray.com/novoda-oss/snapshots/' }
//添加支持JCenter即可
jcenter()
}
}
- 7.2.2:在app模塊中的build.gradle中配置如下代碼
dependencies {
//添加你的項(xiàng)目依賴地址,如下規(guī)則
implementation '倉(cāng)庫(kù)包名:項(xiàng)目名稱:版本號(hào)'
//例如我的:
//implementation 'com.imusic.player:music-player:1.0.0'
}