本文篇幅較長,僅想看教程的朋友請點擊電梯直達
在講述本文之前,先拋出個問題:爲什麼做Maven代理服務器?
我認爲有如下幾個原因 ~~~
why
1. jcenter和google等國外maven庫下載慢
我們在使用Android Studio開發項目時常常需要下載些依賴庫,這些庫往往因爲我大華夏族的wall變得難以下載(0.xxB/s的速度能下到你懷疑人生)或者索性連接不上,像醬紫:
於是,添加一些國內代理鏡像服務器的騷操作孕育而生,比如添加個阿里雲maven庫,此時你的gradle maven地址腳本可能是醬紫的:
repositories {
// 添加阿里雲 maven 地址
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter()
google()
}
它香嗎?是真的香!那種流暢下載的快感真是絕了…
然而他的缺點也有很多,比如依賴庫源稀少,依賴庫版本同步緩慢,而且阿里雲經常宕機和連接超時,有時候還不如直接用jcenter
和google
庫的好。
嗯哼,這樣的操作彷彿並沒有多少改觀現狀。
2. 各個maven庫資源不盡相同,做不到統配資源
就上文而言,我們已經看到有3個maven庫了:aliyun
、jcenter
和google
。
實際開發過程中我們可能需要Gayhub上一些優秀的庫,那麼就要堆這個地址:
maven { url 'https://jitpack.io' }
有時候我們可能需要使用友盟相關服務sdk,我再堆:
maven { url 'https://dl.bintray.com/umsdk/release' }
有時候我們可能需要使用mob相關服務sdk,我繼續堆:
maven { url "http://mvn.mob.com/android" }
有時候。。。給我使勁往裏堆。。。最終你的庫地址腳本可能是醬紫的:
repositories {
// 添加阿里雲 maven 地址
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter()
google()
maven { url 'https://jitpack.io' }
maven { url 'https://dl.bintray.com/umsdk/release' }
maven { url "http://mvn.mob.com/android" }
aaa...
bbb...
......
}
我要哭了,這麼多,腦子都炸了
3. 無法應對gradle頻繁性的刷新本地依賴緩存
由於gradle機制的特性,在開發過程中改變編譯策略或者一些改變gradle配置的舉動以及gradle緩存時效性的觸發都會導致gradle頻繁性的下載和更新本地依賴庫緩存。
一提到下載,一陣酸爽的味道撲面而來。。。
4. 開發夥伴間無法共享現成的依賴庫
比如A夥伴添加了一個流弊的控件庫niubility-widget-library到項目中,還可能需要引用某maven地址:http://mvn.niubility.com/ ,此時你的project下的build.gradle腳本是醬紫的:
repositories {
bbb...
......
// 某流弊的控件庫 maven 地址
maven { url 'http://mvn.niubility.com/' }
}
需要使用的某module下的build.gradle腳本是醬紫的:
dependencies {
......
// 某流弊的控件庫引用id
implementation 'com.niubility:niubility-widget-library:1.0'
}
配置完後在就要sync
一下,然後gradle就會進行令人窒息的下載依賴庫操作,emm…
之後同項目組的B夥伴同步了A夥伴的代碼,也得sync
一下,然後。。。emm…
有一天另一個項目組的C夥伴覺得這個控件很流弊,於是找了A或B同事要了相關配置並集成到自己的項目,仍得sync
一下,然後。。。emm…
我吐了! 每個人都要艱難得下載一遍,效率也忒差了吧!爲啥不能直接共享來自源頭A夥伴已下載好依賴庫呢?
嗯哼,既然有這麼多令人頭大的煩惱,也便有了迫切解決煩惱的需求,有了需求就得滿足,滋滋滋ZZZzzz…
話到這份子上了,要上教程了?不要着急,先分析一波工作原理 ~~~
what
1. 日常開發拉取依賴庫流程
a. AS(Android Studio) Gradle
需要拉取某流弊依賴庫:niubility-widget-library:1.0
b. 按build.gradle添加maven地址的順序先向aliyun
遠程庫請求拉取
c. 發現沒有該依賴,繼而轉向jcenter
拉取
d. 也沒有,繼續轉… 直到niubility
遠程庫
e. 有,於是愉快地將依賴庫響應給Gradle
下載,拉取結束
假設niubility
也沒有,且已經是最後一個倉庫了,那麼流程會是這樣的
f. 沒有,Gradle
結束本次拉取並絕望地告訴你“Resource not found!”
2. 使用代理服務器的拉取依賴庫流程
a. AS Gradle
需要拉取某流弊依賴庫:niubility-widget-library:1.0
b. 向代理服務器請求拉取
c. 代理服務器按添加代理maven庫的順序先向aliyun
代理庫拉取
d. aliyun
代理庫先詢問本地緩存庫有沒有
d. 沒有,則向aliyun
遠程庫請求拉取
d. aliyun
遠程庫也沒有,繼而轉向jcenter
代理庫拉取
e. 折騰一波也沒有,繼續轉… 直到niubility
倉庫
f. 本地緩存庫有,於是愉快地將緩存依賴庫響應給Gradle
下載,拉取結束
假設niubility
本地緩存庫沒有,則向niubility
遠程庫請求拉取
g. 有,於是愉快地將依賴庫響應給niubility
代理庫下載並緩存本地,然後響應給Gradle
下載,拉取結束
再假設遠程庫也沒有,且已經是最後一個代理倉庫了,那麼流程會是這樣的
d. 沒有,告訴Gradle
沒有,Gradle
結束本次拉取並絕望地告訴你“Resource not found!”
額,語言描述有些蒼白,那就貼圖加持吧:
3. 總結Maven代理服務器的原理和優勢
分析上文1和2兩個流程可以看出:
-
Maven代理服務器接替並簡化了
AS Gradle
同各個Maven遠程庫繁雜的註冊和交互工作,其不需要再關心需要配置哪些Maven庫,以什麼方式拉取依賴庫,所需即所得。解決了why->2的問題。 -
Maven代理服務器每向遠程庫拉取依賴庫的同時會緩存至服務器本地,以便於
AS Gradle
的快速拉取。解決了why->3和why->4的問題,緩解了why->1的問題。
別啊,漲粉不易啊親,這就開始 ~~~
how
1. Nexus Maven服務器搭建篇
參考此前文章《基於Nexus 3.x搭建Gradle Maven本地私有倉庫》的“一”和“二”步驟即可。 已搭建過的童鞋請罵罵咧咧地退出本步驟 ~~~
2. Maven代理服務器構建篇
- 創建代理maven倉庫,本文以
aliyun
爲例
新建倉庫:
選擇maven2 (proxy)
:
任起倉庫名稱,填入aliyun
遠程倉庫地址,其它默認直接創建:
同樣,再創建jcenter
等代理倉庫
- 創建代理maven倉庫組
參考上文流程,新建倉庫,選擇maven2 (group)
。
任起倉庫名組稱,選擇需要加入組的代理倉庫,其它默認直接創建:
創建完成後,返回到倉庫列表界面,找到剛創建的“android-repos”倉庫組一欄,點擊“copy”按鈕複製地址,本文爲:http://localhost:8081/repository/android-repos/
嗯哼,大功告成!你的gradle maven地址僅需一個代理庫組地址即可,其它地址可以全部拜拜了~
repositories {
// 代理庫組地址
maven { url 'http://localhost:8081/repository/android-repos/' }
}
如此簡潔的配置,你不心動嗎?如此高效的資源共享,你不心動嗎?如此6得飛起的下載速度,你不心動嗎?動手吧,騷年~