前言
在Android開發(fā)中铅搓,會經(jīng)常遇到需要將寫好的某個lib用于各個不同的項目中隔节。一般的做法,就是將lib直接導(dǎo)入到項目中鳞贷。但是假如lib有bug,那么所有使用lib的項目我們都要進(jìn)去修改lib的bug虐唠,這樣即繁瑣悄晃,工作量又大。假如我們可以像gralde中添加依賴那樣凿滤,直接一句implementation 'xxx'
代碼從maven倉庫中調(diào)用lib妈橄,那么我們就不用再一個一個項目中去修復(fù)lib的bug了,這樣不僅省事了許多翁脆,還安全眷蚓。
正文
一、本地搭建maven私服
- 在
gradle
中添加如下代碼反番,與android{...}
同級
// 添加 maven 插件
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
pom.project {
// 自定義的項目分組
groupId 'com.homeprint.lib'
// 自定義項目名稱
artifactId 'homeprint-core'
// 項目版本號
version '1.0.1'
}
// 自定義本地倉庫路徑沙热,此處是項目根目錄下的 repo 目錄中
repository(url: uri("../repo"))
}
}
}
- 點擊
gradle
右上角的Syc Now
,同步一下項目罢缸,然后在右側(cè)的項目的gradle
中找到Tasks
中的upload
篙贸,雙擊upload
中的uploadArchives
,將項目發(fā)布到本地的maven
倉庫中
- 我配置的本地倉庫路徑是項目根目錄的
repo
目錄枫疆,所以可以看到在項目根目錄中出現(xiàn)倉庫文件夾
本地maven
4.如何在項目中引用發(fā)布的lib爵川?
- 首先在工程的
build.gradle
(是project
的build.gradle
而不是module
的build.gradle
)中添加我們配置的本地倉庫路徑。
(注:build.gradle
中有兩個repositories
息楔,buildscript
中的是用于gradle
本身構(gòu)建時使用的寝贡,allprojects
中的才是給項目依賴使用的,我們在allprojects
的repositories
中添加本地maven
地址)
- 然后在需要使用的
module
中添加依賴implementation 'com.homeprint.lib:homeprint-core:1.0.0'
值依,依賴的項目名規(guī)則為groupId:artfactId:version
圃泡,所以我的依賴為com.homeprint.lib:homeprint-core:1.0.0
這樣就完成了,我們就可以肆無忌憚的在需要的項目中引用我們發(fā)布的lib啦愿险,但是這個僅限于本地使用颇蜡,給自己獨立開發(fā)時提供方便。如果是團(tuán)隊開發(fā)辆亏,大家使用不同的電腦风秤,就不行了。那么團(tuán)隊開發(fā)時褒链,我們想要達(dá)到這種效果該怎么做呢唁情?
二疑苔、使用Nexus3.x搭建maven私服
1. 下載Nexus3.x
現(xiàn)在Nexus最新版已經(jīng)是3.x了甫匹,個人喜歡使用新版,所以本次我們使用Nexus3.x來搭建maven私服。我們先去官網(wǎng)下載Nexus Repository Manager OSS 3.x兵迅,我用的是windows
系統(tǒng)抢韭,所以我下載的是windows版本
的
2. Nexus的安裝與配置
-
目前最新版是
3.14.0
,將下載的壓縮包解壓
解壓后的文件
在減壓的文件夾nexus-3.14.0-04-win64
中有兩個文件夾nexus-3.14.0-04
和sonatype-work
恍箭。nexus-3.14.0-04
是程序刻恭,sonatype-work
是工作目錄,如果以后要備份數(shù)據(jù)扯夭,只要備份sonatype-work
就行鳍贾。 將
nexus-3.14.0-04-win64\nexus-3.14.0-04\bin
文件夾所在路徑添加到環(huán)境變量Path
中,我的路徑是D:\software\nexus\nexus-3.14.0-04-win64\nexus-3.14.0-04\bin
-
配置
nexus-3.14.0-04-win64\nexus-3.14.0-04\etc
目錄下nexus-default.properties
文件
pic_nexus-default.properties
上述配置中有三個字段關(guān)注一下交洗,application-host
骑科、application-port
以及nexus-context-path
application-host :是你訪問的nexus服務(wù)器的IP,默認(rèn)為
0.0.0.0
(即只要是本機上的IP构拳,就能連上nexus服務(wù)器咆爽,詳解點我)。為了安全和屏蔽掉其他IP置森,我們可以改訪問IP為localhost指向的IP(一般默認(rèn)指向127.0.0.1
斗埂,可以去C:\Windows\System32\drivers\etc
的hosts
文件中查詢localhost指向的IP),改成本機上其他IP也可以application-port:是IP的端口號凫海,默認(rèn)為
8081
呛凶,如果端口號被占用,自行換成其他端口號-
nexus-context-path:上下文對象路徑行贪,默認(rèn)是沒有的把兔,如果添加了上下文對象路徑,需要在訪問地址(訪問地址:
application-host:application-port
)后面加上下文對象路徑瓮顽,即訪問地址變?yōu)椋?code>application-host:application-port/nexus-context-path以下是個人更改后的字段值县好,當(dāng)然如果只想簡單使用,不更改也沒事暖混,可以跳過
application-port=8081
application-host=127.0.0.1
- 打開
CMD
缕贡,執(zhí)行命令nexus.exe /run
- 瀏覽器中輸入:
127.0.0.1:8081
(此處為你配置的application-host:application-port
,如果你也配置了nexus-context-path
拣播,則為application-host:application-port/nexus-context-path
晾咪,例:假如我配置nexus-context-path=/test
,瀏覽器中輸入:127.0.0.1:8081/test
)贮配,進(jìn)入nexus管理頁面谍倦,至此nexus已經(jīng)安裝并且啟動成功
nexus入口
3. Nexus的倉庫創(chuàng)建
在創(chuàng)建倉庫前,先介紹一下倉庫的三種存儲類型Release
泪勒、Snapshot
和Mixed
昼蛀,創(chuàng)建倉庫時會使用到
- Release(正式版): 正式版宴猾,適合項目穩(wěn)定后正式發(fā)布使用,特性看下面的原理簡介 [important]叼旋。
- Snapshot(快照版): 快照版仇哆,適合項目在開發(fā)調(diào)試中使用,特性看下面的原理簡介 [important] 夫植。
- Mixed(混合版): 可包含release和snapshot版本
Release
與Snapshot
的原理簡介:它們的主要區(qū)別在于本地獲取這些依賴的機制不同讹剔。
- 對于Release版本的項目: 當(dāng)項目中添加了一個正式版的version為x的依賴時,構(gòu)建工具在構(gòu)建項目時會從遠(yuǎn)程倉庫中下載這個version為x的依賴到本地倉庫緩存起來详民,下次再構(gòu)建項目時延欠,構(gòu)建工具會從本地倉庫中查找是否存在這個version為x的依賴,存在就不會在去遠(yuǎn)程倉庫中拉取沈跨。這種特性會導(dǎo)致在團(tuán)隊開發(fā)中衫冻,如果你發(fā)布一個正式版的項目時,仍然使用的是同一個version谒出,就可能出現(xiàn)其他使用這個version項目的成員根本接收不到項目的最新變更隅俘,這是糟糕的,為了生命安全笤喳,大家盡量不要這么做为居。所以,在每次發(fā)布正式版項目時杀狡,必須更新version蒙畴。
- 對于Snapshot版本的項目: 當(dāng)項目中添加了一個快照版的version為x的依賴時,不管本地倉庫中是否存在這個version為x的依賴呜象,構(gòu)建工具都會嘗試從遠(yuǎn)程倉庫中查看這個version為x的依賴是否最新膳凝。這樣就能保證團(tuán)隊開發(fā)時,所有使用這個version為x的依賴的項目都能獲取到依賴最新的變更恭陡,而且不用不停的迭代依賴的version蹬音。最后一還有一點,Snapshot版項目發(fā)布時的version一定要以
-SNAPSHOT
結(jié)尾休玩,英文字母必須大寫渔肩。
下面正式開始倉庫創(chuàng)建流程:
- 先登錄巢株,初始用戶名和密碼分別為
admin
和admin123
- 登錄后,如下圖操作所示赁遗,看到有個模塊為
Blob Stores
钳踊,這是文件存儲的地方碱鳞,默認(rèn)存在default
中悼沈,你可以點擊Create blob store
自己創(chuàng)建一個存儲點
文件存儲的地方
這里嘲叔,我自己創(chuàng)建了名為homeprint
的新的存儲點
新建存儲點
homeprint存儲點 -
創(chuàng)建自己的maven倉庫
創(chuàng)建自己的maven倉庫
選擇要創(chuàng)建的maven倉庫類型 - 可以看到一共有三種maven類型的倉庫供我們選擇
-
hosted(宿主倉庫) :專門存放無法從遠(yuǎn)程倉庫中下載的構(gòu)件或者公司內(nèi)部自主開發(fā)的一些構(gòu)件。當(dāng)hosted倉庫找不到目標(biāo)構(gòu)件時蜒犯,并不能從遠(yuǎn)程倉庫下載组橄。并且想要將內(nèi)部開發(fā)構(gòu)件上傳到maven倉庫荞膘,三種倉庫中只能使用hosted。
宿主倉庫創(chuàng)建 -
proxy(代理倉庫) : 當(dāng)用戶向proxy請求一個資源時晨炕,proxy會先在本地倉庫中尋找是否有該資源衫画,沒有的話會從遠(yuǎn)程倉庫下載毫炉,然后返回給用戶瓮栗;同時會緩存在本地,下次用戶再請求相同資源時瞄勾,就可以直接在本地中找到并返回給用戶费奸。proxy起到一層緩存與中轉(zhuǎn)的作用。
proxy代理的遠(yuǎn)程倉庫可以配置进陡,這里我選擇阿里云的maven倉庫(http://maven.aliyun.com/nexus/content/groups/public/
愿阐,因為在國內(nèi)比中央倉庫快很多)
(注意:不支持將內(nèi)部自主研發(fā)的項目上傳到proxy上,只能上傳到hosted中趾疚,proxy的主要作用只是緩存從遠(yuǎn)程倉庫下載的資源和作為中轉(zhuǎn)站去遠(yuǎn)程倉庫下載需要的資源)
代理倉庫創(chuàng)建 -
group(倉庫組) :多個倉庫的聚合體缨历,將你在nexus中想要使用的maven倉庫聚合在一起,對用戶暴露統(tǒng)一的地址糙麦,這樣用戶就不需在項目中配置多個maven地址了辛孵。(同樣也不支持將內(nèi)部研發(fā)項目上傳到group中,只能發(fā)布到hosted)
倉庫組創(chuàng)建
- 倉庫創(chuàng)建完成(不必要三種倉庫都創(chuàng)建赡磅,選擇你想創(chuàng)建的就行)魄缚。點擊倉庫的
copy
可以拷貝倉庫路徑。
倉庫創(chuàng)建完成
4. 發(fā)布項目到maven倉庫
第一種:使用gradle自動發(fā)布
在需要發(fā)布的module的build.gradle
中加入如下代碼焚廊,與在第一種在發(fā)布到maven倉庫的實現(xiàn)基本一致
apply plugin: 'maven'
uploadArchives {
configuration = configurations.archives
repositories {
mavenDeployer {
// 倉庫路徑(只能是hosted倉庫)
repository(url: 'http://192.168.10.128:8081/repository/homeprint-hosted/') {
// 你 Nexus 的賬戶密碼
authentication(userName: 'admin', password: 'admin123')
}
pom.project {
version '1.0.1'
artifactId 'homeprint-common'
groupId 'com.homeprint.lib'
description 'xxxxxx'
}
}
}
}
然后在右側(cè)的雙擊下圖中的uploadArchives
冶匹,即可發(fā)布上傳
上傳完成后,可以在倉庫中看到發(fā)布的項目
第二種:使用網(wǎng)頁上傳
點擊倉庫的upload component
可以手動上傳咆瘟,一般現(xiàn)成的jar或者aar文件可以直接選擇手動上傳
5. module中使用發(fā)布的項目
在工程的build.gradle
中添加maven
地址
allprojects {
repositories {
maven { url 'http://127.0.0.1:8081/repository/homeprint-group/' }
}
}
在module的build.gradle
中添加依賴
implementation 'com.homeprint.lib:homeprint-common:1.0.0'
三嚼隘、其他注意事項
1. gradle中如何指定要上傳到maven的文件
// 將項目指定的 _exports 文件夾下的內(nèi)容打成 jar
task makeJar(type: Jar) {
baseName = "hpauth-exports"
version = "1.0.0"
extension = "jar"
from('build/intermediates/classes/debug/')
from('build/tmp/kotlin-classes/debug/')
include('com/homeprint/module/auth/_exports/**')
destinationDir = file('build/_exports')
}
// 配置需要上傳到 maven 倉庫的文件,即將上面打包的 jar 上傳
artifacts {
archives makeJar
}
// 上傳部分仍然與之前相同
uploadArchives {
repositories {
mavenDeployer {
repository(url: 'http://127.0.0.1:8081/repository/maven-snapshots/') {
authentication(userName: 'admin', password: 'admin123')
}
pom.project {
version '1.0.0-SNAPSHOT'
artifactId 'hpauth-exsppt'
groupId 'com.homeprint.module'
description 'xxxxxxx'
}
}
}
}
2. 關(guān)于外部設(shè)備訪問Nexus的問題
上述中袒餐,一開始我配置的IP地址是127.0.0.1
嗓蘑,此IP地址外部設(shè)備是連接不上的,僅能本機訪問匿乃。如果要在同一局域網(wǎng)內(nèi)讓外部設(shè)備可以訪問桩皿,請更改為能讓外部設(shè)備連上的IP地址,例如PC在局域網(wǎng)內(nèi)被分配到的IPV4地址幢炸。詳解點我
3. 關(guān)于Nexus初始時的默認(rèn)倉庫
nexus在一開始就給我們提供了一些默認(rèn)倉庫
- maven-central:代理倉庫泄隔,配置的是maven官方2號倉庫的地址
- maven-public:倉庫組
- maven-releases:宿主倉庫,倉庫的存儲類型為Release
- maven-snapshot:宿主倉庫宛徊,倉庫的存儲類型為Snapshot
上述內(nèi)容中已經(jīng)對這些倉庫的類型介紹過佛嬉,就不在多說了逻澳。這些默認(rèn)倉庫我們是可以直接使用的,基本已經(jīng)滿足我們所有的需求暖呕,所以如果不創(chuàng)建倉庫斜做,可以直接使用默認(rèn)倉庫。
4. Android開發(fā)中常用的maven代理地址
- 阿里云:http://maven.aliyun.com/nexus/content/groups/public/
- google:https://dl.google.com/dl/android/maven2/
- jcenter:https://jcenter.bintray.com/
- mavenCentral:https://repo.maven.apache.org/maven2/
- jitpack:https://jitpack.io
以上幾個基本就是android開發(fā)中常用的幾個maven倉庫了湾揽,其中阿里云是國內(nèi)倉庫瓤逼,其他是國外倉庫。國內(nèi)倉庫的優(yōu)勢在于下載速度快库物,畢竟祖國偉大的網(wǎng)絡(luò)對于國外的網(wǎng)絡(luò)不怎么友好霸旗。但是國內(nèi)倉庫可能更新會比國外倉庫慢一點。出于以上考慮戚揭,我們可以將以上倉庫都集成在group倉庫組中诱告,一定要將阿里云放在其他國外maven倉庫的上面,因為訪問倉庫時的順序是從上往下訪問的民晒,這樣就既有了國內(nèi)倉庫的速度精居,又可以在國內(nèi)倉庫沒有資源時,去國外倉庫獲取到資源潜必。
5. Nexus中用戶的權(quán)限管理
團(tuán)隊開發(fā)的時候靴姿,為了避免散發(fā)超級管理員權(quán)限,可以根據(jù)每個成員的實際情況刮便,給他們配置用戶角色和權(quán)限空猜。
-
Security -> Privileges: 所有的權(quán)限都放在了這里
權(quán)限大全 -
Security -> Roles: 角色管理界面,可在此界面創(chuàng)建角色
創(chuàng)建角色
角色權(quán)限 -
Security -> Users: 用戶管理界面恨旱,可在此界面創(chuàng)建用戶
創(chuàng)建用戶
用戶權(quán)限 -
Security -> Anonymous: 匿名用戶管理界面(即游客管理)辈毯,這里有個注意的地方,如下圖中搜贤,有個
Allow anonymous users to access the server
谆沃,游客默認(rèn)是有瀏覽
和讀取倉庫
的權(quán)限的,如果取消勾選仪芒,則游客沒有任何權(quán)限唁影。
游客權(quán)限1
游客權(quán)限2
6. 如何從Nexus中下載jar包或者aar包
四、如何實現(xiàn)在外網(wǎng)中訪問自己的maven倉庫
- 將項目上傳到
Github
掂名、碼云
或者類似的管理平臺中据沈,通過jitpack
發(fā)布(最簡單的方式) - 將項目發(fā)布到
jcenter
或者mavenCentral
中,這個比第一種復(fù)雜一些饺蔑,如果要使用jcenter
發(fā)布锌介,可以使用bintray-release
插件 - 將
Nexus
部署到阿里云或者其他云服務(wù)器中,這時使用的版本不再是Windows
版而是Unix
版 - 以上都是常用的方法,因為時間關(guān)系就不再詳細(xì)介紹了孔祸,大家可以自行百度隆敢。最后介紹一種取巧的方法,就是找一些可以將內(nèi)網(wǎng)IP映射到外網(wǎng)訪問的小工具崔慧,比如
nat123
拂蝎、花生殼
之類的,這里我用的是windows_386
惶室,一共就三個文件
windows_386
其中a.bat
是運行文件温自,里面就一行代碼如下:
ngrok -config=ngrok.cfg -subdomain my 8080
其中my
為域名的前綴,8080
為端口號拇涤,這兩樣是可以根據(jù)需要捣作,自行修改的誉结。雙擊a.bat
文件開始運行程序鹅士,結(jié)果如下:
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding http://my.tunnel.qydev.com -> 127.0.0.1:8080
Forwarding https://my.tunnel.qydev.com -> 127.0.0.1:8080
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
當(dāng) Tunnel Status
為online
時,代表已經(jīng)將內(nèi)網(wǎng)IP映射到公網(wǎng)上惩坑,映射的IP為127.0.0.1
(不可變)掉盅,端口號為你在a.bat
中配置的端口號,此處為8080
(可配置)以舒。與IP綁定的域名為my.tunnel.qydev.com
趾痘,其中前綴my
即為你在a.bat
中配置的前綴。這樣你在瀏覽器中輸入my.tunnel.qydev.com
就可以連上本機的127.0.0.1:8080
蔓钟。然后永票,將nexus的IP和端口號分別配置為127.0.0.1
和8080
就可以在外網(wǎng)訪問到本機上的Nexus了。這種方式很簡單滥沫,成本低侣集,但是訪問速度有點慢,但是誰還沒有個不在公司coding的時候兰绣,這時候就可以提供點便利了世分。