新入職一家公司,初進公司進行一個即時通訊SDK的開發(fā),開發(fā)完成后打成aar包供外部使用,工程中有兩個模塊,aar包只能包含一個模塊,所以這里將兩個模塊打成兩個aar包放到nexus搭建的maven倉庫,模塊之間實現(xiàn)遠程依賴,這樣最后用戶接入一個aar包就實現(xiàn)了sdk的對接,初次接觸這方面的東西,所以寫下這篇文章記錄一下。
一、下載安裝nexus
nexus下載地址(官網(wǎng)下載地址):https://www.sonatype.com/download-oss-sonatype

打開網(wǎng)站后是上面這樣這樣的,填好信息后點擊DOWNLOAD進入系統(tǒng)選擇。

我的是windows系統(tǒng),點擊之后會跳轉到下載頁。

到了下載頁靜靜等著就行,但我沒翻墻,所以苦等半天告訴我被拒絕了,不過方式方法是對的,由于地理因素最終沒走到一起,只有另辟蹊徑啦,看到這里如果你跟我一樣,有一樣的苦衷(不會翻墻),那么你有必要點開這個鏈接,里面有寶貝的喔。鏈接:https://pan.baidu.com/s/1shg-bOxv_tB7jZZVohrk3Q 提取碼:5x44。里面的版本是3.18的,如果你覺得不合適,也可以去網(wǎng)上尋求更好的。

上面是下載解壓之后的,里面有兩個文件夾,我們記錄下第一文件的目錄路徑,去配置一下系統(tǒng)環(huán)境,不配置的話每次運行nexus都要進入到這個目錄里面挺麻煩的,所以先去配置環(huán)境變量。怎么進到環(huán)境變量配置頁這里就不說了,直接來看配置過程:

在系統(tǒng)變量那一欄點擊新建,取一個自己喜歡的名字,將剛剛記錄的目錄路徑復制到變量值一欄,點擊確定,然后將這個新增的變量加到C盤路徑下。

配置完成后記得一層一層的點確定返回去,否則不生效喔。接下來打開命令窗口,輸入nexus.exe/install,按回車鍵后顯示Installed service 'nexus'.,至此nexus服務就算安裝好了。

二、運行nexus服務
通過上面的步驟完成了nexus的下載和安裝,下面讓它跑起來,有兩種方式去啟動nexus。
一種是通過命令行輸入nexus.exe/run,按下回車鍵后是一輪漫長的等待,就像下面這樣:

如果你等到了上圖中紅框里的那句話,那么一切都是值得的,如果沒等到,也不用疑惑不用焦躁,要不,重啟電腦試試,我初次探索的時候試了好多次都沒等到這句話,結果第二天再一運行她就神奇的出現(xiàn)了,有時就是這么奇妙,就像那該死的愛情,突然的出現(xiàn),又突然的消失,咱也不知道咋回事,咱也不敢問。所以當你等到這句話之后,用第一種方法命令行啟動nexus就成功了,不習慣用命令行的就可以用下面這種方法去啟動:

當你安裝了之后,打開任務管理器,點擊服務,列表是按字母排序的,一直往下翻找到nexus后右鍵摟它,然后點擊開始,這樣nexus也就運行起來了。
運行起來后,我們可以通過瀏覽器打開網(wǎng)址http://localhost:8081/nexus/進入到管理后臺,默認的端口號是8081,如果打不開可以看看是不是端口被系統(tǒng)其他進程占用了,如果要更改ip地址和端口號的話,在安裝目錄下的etc文件夾中的nexus-default文件中進行更改,如下圖:


改完之后保存一下,重新運行一下nexus就可以了,打開的后臺管理是這樣的:

點擊右上角sign in登錄,一般初次登錄密碼為默認的賬號:admin 密碼 admin123,如果提示密碼錯誤的話,安裝目錄下一個文件記錄了密碼,復制過來就可以,初次登錄之后會讓你改密碼,不知道是不是我改過密碼的緣故,我找不到那個記錄密碼的文件了,這里就不截圖了,那個文件挺好認的,文件名是PASSWORD。
登錄進來之后是下面這樣的:

至此nexus的運行就算成功完成了,下面來看看資源包的上傳過程。
三、上傳資源包
點擊左邊的Browse之后,有一個倉庫列表:

可以看到type有三種,proxy、hostde和group,他們的區(qū)別是:
group:是一個倉庫組,可包含hosted和proxy兩種庫,下載時按配置順序從中依次查找;
hosted:一般部署我們自己項目打包的jar,供內(nèi)部人員下載;
proxy:代理遠程倉庫,maven-central是默認maven中央倉庫代理,maven-aliyun是后加的阿里遠程庫代理,通過代理從遠程庫中下載的依賴都會被緩存到nexus的proxy庫中。
這里我是將包放在hosted type下的mvaen-releases倉庫下,初次點進去里面是沒有東西的:

可以點擊這兩個地方上傳aar包,配置好相關信息后,點擊upload即可:

上傳之后就能看到他了,如下:

至此,你上傳的包就能在項目里引用了,不過在介紹引用之前,先介紹一下另一種傳包的方式,在項目工程里去配置好信息,實現(xiàn)一鍵上傳,每次只用修改版本號,這種方式方便很多,下面來看看:
apply plugin:'maven'
//上傳到maven倉庫
uploadArchives { //新增 ,因為Android Studio gradle 支持maven插件,所以可以添加此task
configuration = configurations.archives
repositories {
mavenDeployer {
repository(url: 'http://loaclhost:8081/nexus/repository/maven-releases/') {
authentication(userName: 'admin', password: 'admin123')
}
pom.project {
version '1.0.0' //版本號
artifactId '****' //和前面網(wǎng)站上填寫的一樣
groupId '*****' //和前面網(wǎng)站上填寫的一樣
packaging 'aar' //打aar包就填寫aar
description 'update describe' //更新描述
}
}
}
}
將上面這段代碼復制到模塊下的build.gradle,注意不是project下的build.gradle,放在最外層,上面的apply plugin:'maven'不要忘了加,url是通過下圖中那樣復制過來的,其余的信息都是自定義,定義成你喜歡的樣子就可以。

第二種方式配置好之后,每次發(fā)版更改版本號就行,上傳的話點擊AS右上角Gradle,找到模塊下upload下的uploadArchives 任務,sync之后就會有這個任務,雙擊它就可以了,上傳成功后在管理后臺就能看到上傳的資源包了。
至此,資源包的上傳也就完成了,最后來看看怎么一引用。
四、項目引用
引用分兩步。
第一步就是先得連接上遠程maven倉庫,就是在project下配置遠程倉庫地址:
allprojects {
repositories {
google()
jcenter()
maven {
url 'http://localhost:8081/nexus/repository/maven-releases/' //這個路徑就是Browse下maven-release右邊有一個copy按鈕,復制出來的。
}
maven { url "https://jitpack.io" }
}
}
第二步就是導入依賴,還記的之前配置的groupId、artifactId和version嗎,項目里引用的格式為:implementation 'groupId:artifactId:version',將引號內(nèi)的內(nèi)容替換成之前配置的信息就完成了資源包得引用。
至此就完成了,用nexus搭建maven倉庫,并上傳資源包,最后項目中引用這么一個過程。由于第一次弄,所以寫這篇文章來記錄一下探索過程,希望能幫到其他人,其中有不當?shù)胤竭€望指正,謝謝。
2020.6.12更新------------------------------------------------------
問題一:每次更新發(fā)版時需要更新版本號,否則上傳不成功,報錯。比如遠程倉庫已經(jīng)有了1.0.0版本,這是如果上傳的版本還是1.0.0就會報如下錯誤:
Return code is: 400, ReasonPhrase: Repository does not allow updating assets: maven-releases.
所以如果在開發(fā)過程中遇到如下錯誤,改個遠程沒有的版本號再試試。
問題二:如上操作過程依賴的aar包,會發(fā)現(xiàn)看不到源碼,點開后顯示為下面這樣:
public final var cxt: android.app.Activity /* compiled code */
public final val fm: androidfanx.fragment.app.FragmentManager /* compiled code */
出現(xiàn)上面這種情況的原因是沒有上傳源代碼,依賴aar包后進行反編譯,所以無法看到源碼,也就無法進行debug調(diào)試。
解決這種問題的方法就是在上傳項目aar包的同時將項目源碼上傳,在要上傳的模塊中加上以下代碼,創(chuàng)建上傳源碼的任務,然后執(zhí)行上面上傳aar包的操作就會自動將源碼上傳到遠程,此時依賴后就能看到源碼了。
//上傳源碼
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
artifacts {
archives androidSourcesJar
}