微笑面對(duì)每一天,耶4榭8吞怠!咳咳下面的同學(xué)不要講話啦砌溺,開(kāi)始上課啦
這一章影涉,我們來(lái)講講私服的知識(shí),私服是
maven
的重要組件规伐,但它并不是maven
內(nèi)部的核心概念蟹倾,它僅僅是一種衍生出來(lái)的特殊maven
倉(cāng)庫(kù)在前面的章節(jié)中已經(jīng)提到,使用私服可以起到如降低中央倉(cāng)庫(kù)負(fù)荷,節(jié)省外網(wǎng)帶寬鲜棠,加速
maven
構(gòu)建肌厨,自己部署構(gòu)建等作用maven
私服種類很多,流行的也有幾個(gè)岔留,但這里我就不一一做講解了夏哭,下面將主要對(duì)nexus
私服做詳細(xì)介紹,其他私服的功能和nexus
也是相似的献联,有機(jī)會(huì)可以自己下去了解一下nexus
是一款不錯(cuò)的倉(cāng)庫(kù)管理軟件,這里主要對(duì)nexus
進(jìn)行講解
nexus安裝
- 下載
nexus
壓縮包(基于windows
系統(tǒng))
需要到官網(wǎng)下載nexus
私服壓縮包何址,這里需要注意的一點(diǎn)是下載的壓縮包一定要是archive
版的里逆,因?yàn)?code>professional版需要提供一個(gè)License
,下面是下載地址
https://support.sonatype.com/hc/en-us/articles/218238798
雖然現(xiàn)在nexus
已經(jīng)發(fā)布到3x
版本了,但是我還是比較喜歡用2x
的extjs
界面用爪,所以這里我下載的是2.14
版本的nexus oss
- 安裝
nexus
服務(wù)
將下載的壓縮包解壓到指定目錄原押,解壓后共有兩個(gè)文件夾
nexus-2.14.3-02
該目錄包含了nexus
運(yùn)行所需的文件,比如啟動(dòng)腳本偎血,依賴等
sonatype-work
該目錄是運(yùn)行時(shí)目錄诸衔,用于生成運(yùn)行時(shí)所需要的配置文件,日志文件倉(cāng)庫(kù)文件等
nexus-2.14.3-02
該目錄包含了nexus
運(yùn)行所需的文件颇玷,比如啟動(dòng)腳本笨农,依賴等
sonatype-work
該目錄是運(yùn)行時(shí)目錄,用于生成運(yùn)行時(shí)所需要的配置文件帖渠,日志文件倉(cāng)庫(kù)文件等
通過(guò)管理員命令行工具進(jìn)入到nexus
安裝目錄/nexus-2.14.3-02/bin
執(zhí)行
nexus.bat install
安裝系統(tǒng)服務(wù),完成后執(zhí)行nexus.bat start
命令啟動(dòng)nexus
服務(wù)谒亦,或者在服務(wù)管理界面(win+R
調(diào)出運(yùn)行面板->services.msc
進(jìn)入windows
服務(wù)控制臺(tái)),這時(shí)可以在控制臺(tái)中看到nexus
服務(wù)已經(jīng)生成
當(dāng)然nexus.bat
其中提供了幾個(gè)常用的命令
install
安裝nexus
服務(wù)
uninstall
卸載nexus
服務(wù)
start
啟動(dòng)nexus
服務(wù)
stop
停止nexus
服務(wù)
restart
重啟nexus
服務(wù) - 登錄到
nexus
控制臺(tái)
nexus
服務(wù)啟動(dòng)完成后,我們可以通過(guò)瀏覽器輸入http://localhost:8081/nexus
訪問(wèn)nexus
控制臺(tái)空郊,可以通過(guò)管理員(admin/admin123
)用戶登錄到控制臺(tái)
運(yùn)行后份招,下面將會(huì)對(duì)控制臺(tái)各個(gè)功能模塊進(jìn)行講解,并提供一個(gè)從項(xiàng)目代碼到倉(cāng)庫(kù)的完整配置過(guò)程
nexus倉(cāng)庫(kù)與倉(cāng)庫(kù)組(repository)
作為maven
的倉(cāng)庫(kù)服務(wù)軟件狞甚,倉(cāng)庫(kù)自然是nexus
最重要的概念锁摔,nexus
包含幾種類型的倉(cāng)庫(kù):代理倉(cāng)庫(kù),宿主倉(cāng)庫(kù)和倉(cāng)庫(kù)組等
nexus內(nèi)置倉(cāng)庫(kù)
打開(kāi)nexus
控制臺(tái)左側(cè)Repositories
可以看到maven
中已經(jīng)創(chuàng)建了幾種倉(cāng)庫(kù)
Central
該倉(cāng)庫(kù)代理中央倉(cāng)庫(kù)哼审,其策略為release
,因此只會(huì)下載中央倉(cāng)庫(kù)的發(fā)布版本Releases
這是一個(gè)策略為release
的宿主倉(cāng)庫(kù)谐腰,用來(lái)部署組織內(nèi)部的發(fā)布版本構(gòu)件Snapshots
這是一個(gè)策略為snapshots
的宿主倉(cāng)庫(kù),用來(lái)部署組織內(nèi)部的快照版本構(gòu)件3rd party
這是一個(gè)策略為release
的宿主倉(cāng)庫(kù)棺蛛,用來(lái)部署無(wú)法從遠(yuǎn)程倉(cāng)庫(kù)下載的第三方發(fā)布版本構(gòu)件Apache Snapshots
這是一個(gè)策略為snapshots
的代理倉(cāng)庫(kù)怔蚌,用來(lái)專門(mén)代理apache maven
倉(cāng)庫(kù)的快照版本構(gòu)件Public Repositories
倉(cāng)庫(kù)組將上述所有策略為release
的倉(cāng)庫(kù)聚合并通過(guò)一致性的地址提供服務(wù),當(dāng)然這里可以配置將倉(cāng)庫(kù)加入到組中上面的這些倉(cāng)庫(kù)是如何被使用的呢旁赊?
舉個(gè)例子桦踊,項(xiàng)目
X
依賴于很多流行的開(kāi)源類庫(kù)如junit
,這些構(gòu)件都可以從中央倉(cāng)庫(kù)獲取终畅,因此central
代理倉(cāng)庫(kù)就會(huì)被用來(lái)代理中央倉(cāng)庫(kù)籍胯,并從中央倉(cāng)庫(kù)下載指定依賴并緩存到私服中竟闪,X
項(xiàng)目還依賴了Oracle
的jdbc
驅(qū)動(dòng),由于版權(quán)因素杖狼,無(wú)法從公共倉(cāng)庫(kù)中獲取炼蛤,因此公司管理員將其部署到3rd party
倉(cāng)庫(kù)中供X
使用,X
項(xiàng)目的快照版本構(gòu)件成功后會(huì)被部署到Snapshots
倉(cāng)庫(kù)供其他小組使用蝶涩,當(dāng)X
發(fā)布正式版本的時(shí)候理朋,其構(gòu)件將會(huì)發(fā)布到Releases
倉(cāng)庫(kù)中,由于X
項(xiàng)目用到了很多倉(cāng)庫(kù)绿聘,為每一個(gè)倉(cāng)庫(kù)聲明配置又很麻煩嗽上,所以可以統(tǒng)一使用倉(cāng)庫(kù)組Public Repositories
和Public Snapshots Repositories
maven
倉(cāng)庫(kù)分類的概念
下圖更直觀的展現(xiàn)了代理倉(cāng)庫(kù)、宿主倉(cāng)庫(kù)熄攘、倉(cāng)庫(kù)組他們之間的關(guān)系
創(chuàng)建宿主倉(cāng)庫(kù)
點(diǎn)擊左側(cè)Repositories
->Add
->Hosted Repositories
就會(huì)出現(xiàn)一個(gè)表單
Repository Policy
屬性兽愤,指定倉(cāng)庫(kù)的發(fā)布類型有Snapshot
,Release
兩種Deployment Policy
屬性,默認(rèn)是Disable Redeploy
挪圾,也就是不允許部署浅萧,如果需要部署則需要改為Allow Redeploy
,不然項(xiàng)目發(fā)布時(shí)會(huì)報(bào)錯(cuò)Allow File Browsing
屬性,是否允許瀏覽倉(cāng)庫(kù)中的內(nèi)容哲思,一般為true
, 每一個(gè)倉(cāng)庫(kù)創(chuàng)建完成后都會(huì)有一個(gè)Browse Storage
洼畅,在其中以樹(shù)形方式羅列了當(dāng)前倉(cāng)庫(kù)的存儲(chǔ)文件內(nèi)容Include in Search
屬性,表示是否對(duì)該倉(cāng)庫(kù)進(jìn)行索引并提供搜索服務(wù)也殖,一般為true
Publish URL
屬性土思,用來(lái)控制是否通過(guò)url
提供服務(wù),如果選false
,當(dāng)訪問(wèn)該倉(cāng)庫(kù)時(shí)會(huì)得到http 404 Not Found
錯(cuò)誤Not Found Cache TTL
表示當(dāng)一個(gè)文件沒(méi)有找到后忆嗜,緩存這一不存在信息的時(shí)間己儒,默認(rèn)值為1440
分鐘內(nèi)(也就是一天),在規(guī)定的時(shí)間內(nèi)如果nexus
再次得到該文件的請(qǐng)求捆毫,那么它將直接返回不存在信息
創(chuàng)建nexus代理倉(cāng)庫(kù)
前面的參數(shù)和宿主倉(cāng)庫(kù)一致闪湾,這里我只強(qiáng)調(diào)代理倉(cāng)庫(kù)的一些特定參數(shù)
Remote Storage Location
設(shè)置被代理的遠(yuǎn)程倉(cāng)庫(kù)地址Download Remote Indexes
是否下載遠(yuǎn)程倉(cāng)庫(kù)的index
索引文件,下載索引后即使倉(cāng)庫(kù)中沒(méi)有緩存指定的依賴绩卤,也可以在nexus
中搜索得到依賴pom
Checksum Policy
設(shè)置當(dāng)依賴校驗(yàn)出錯(cuò)時(shí)的處理方式途样,可以設(shè)置忽略、記錄警告信息濒憋,拒絕下載Artifact Max Age
表示構(gòu)件緩存的時(shí)間何暇,對(duì)于release
版本來(lái)說(shuō)為-1
,表示一經(jīng)下載就一直保存凛驮,對(duì)于snapshots
來(lái)說(shuō)裆站,每隔一天就需要重新緩存代理構(gòu)件Metadata Max Age
表示元配置文件的緩存時(shí)間
創(chuàng)建nexus倉(cāng)庫(kù)組
倉(cāng)庫(kù)組并不是一個(gè)實(shí)實(shí)在在存在的東西,而是一個(gè)虛擬出來(lái)的東西,它并沒(méi)有Release
與Snapshot
之分宏胯,倉(cāng)庫(kù)組中包含的倉(cāng)庫(kù)順序決定了倉(cāng)庫(kù)組遍歷所含倉(cāng)庫(kù)的次序羽嫡,最好將常用的倉(cāng)庫(kù)放在前面
nexus索引與構(gòu)件搜索
在nexus
中為了能夠?qū)}(cāng)庫(kù)中的構(gòu)件進(jìn)行搜索服務(wù),需要我們將倉(cāng)庫(kù)配置中的Download Remote indexes
設(shè)置為true
,當(dāng)修改了這個(gè)設(shè)置后肩袍,我們可以點(diǎn)擊左側(cè)Scheduled Tasks
查看當(dāng)前任務(wù)進(jìn)度情況
當(dāng)完成索引的下載之后杭棵,我們可以在倉(cāng)庫(kù)的Browser Storage
選項(xiàng)卡中查看當(dāng)前倉(cāng)庫(kù)的索引結(jié)構(gòu),然后我們就可以在左側(cè)導(dǎo)航欄的Archive Search
輸入框中搜索我們需要的構(gòu)件了
nexus
提供了幾種搜索方式氛赐,常用的如keyword search
, GAV Search
(用戶通過(guò)設(shè)置groupid
魂爪,artifactId
,version
)進(jìn)行搜索操作
部署構(gòu)建到nexus私服中
nexus
提供了兩種方式將構(gòu)建部署到私服中,一種是通過(guò)maven
自動(dòng)部署鹰祸,需要借助distributeMangement
,另一種是直接上傳jar包
通過(guò)distributeManagement
自動(dòng)部署構(gòu)件
在日常開(kāi)發(fā)中甫窟,我們可以將項(xiàng)目的snapshot
發(fā)布到項(xiàng)目snapshot
倉(cāng)庫(kù)中,發(fā)布版發(fā)布到release
倉(cāng)庫(kù)中蛙婴,這需要在項(xiàng)目pom
中做一些手腳
下面是mvn-study
項(xiàng)目的配置
<distributionManagement>
<repository>
<id>mvn-study-releases</id>
<name>Mvn Study Project Release Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-releases/</url>
</repository>
<snapshotRepository>
<id>mvn-study-snapshots</id>
<name>Mvn Study Project Releases Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-snapshots/</url>
</snapshotRepository>
</distributionManagement>
如果給定的倉(cāng)庫(kù)設(shè)置了訪問(wèn)權(quán)限,比如mvn-study
該項(xiàng)目建立的snapshot
,只有mvn-study-deployer
角色有操作權(quán)限尔破,所以我們還需要為其添加權(quán)限街图,這需要在.m2/settings.xml
中添加訪問(wèn)權(quán)限:
<server>
<id>mvn-study-releases</id>
<username>zhenlian</username>
<password>123456</password>
</server>
<server>
<id>mvn-study-snapshots</id>
<username>zhenglian</username>
<password>123456</password>
</server>
手動(dòng)上傳jar包到倉(cāng)庫(kù)
這是比較傳統(tǒng)的一種方式,比如我們?cè)诠矀}(cāng)庫(kù)中無(wú)法找到的第三方依賴懒构,可以通過(guò)此方法上傳到私服中餐济,maven3
中,只有release
倉(cāng)庫(kù)允許用戶上傳依賴
在倉(cāng)庫(kù)的配置項(xiàng)中胆剧,有一個(gè)artifact upload
選項(xiàng)頁(yè)
我們需要添加
GAV Definition
,也就是當(dāng)前jar
的坐標(biāo)信息絮姆,然后上傳給定的依賴jar
包
nexus權(quán)限管理
在組織中使用nexus
往往會(huì)有一些權(quán)限要求,例如只有管理員才能配置nexus
,只有某些團(tuán)隊(duì)成員才能部署構(gòu)件
nexus訪問(wèn)控制模型
nexus
是基于權(quán)限(privileges
)做訪問(wèn)控制的秩霍, 服務(wù)器的每一個(gè)資源都有相應(yīng)的權(quán)限來(lái)控制篙悯,這些權(quán)限的分發(fā)又是通過(guò)角色來(lái)實(shí)現(xiàn)的,用戶可以被賦予多個(gè)角色铃绒,角色也可以配置多個(gè)權(quán)限鸽照,角色同時(shí)還可以包含其他角色
nexus
默認(rèn)創(chuàng)建了三個(gè)用戶:admin
擁有對(duì)nexus
的完全控制,密碼為admin123
deployment
可以對(duì)倉(cāng)庫(kù)內(nèi)容瀏覽颠悬、搜索矮燎、上傳、部署赔癌,但是無(wú)法配置nexus
anonymous
只能瀏覽和搜索倉(cāng)庫(kù)诞外,但是不能下載nexus
中同時(shí)預(yù)定義了一些常用且重要的角色:UI:Basic UI Privileges
包含對(duì)nexus
界面必須的最基本權(quán)限UI:Repository Browser
包含瀏覽倉(cāng)庫(kù)頁(yè)面所需要的權(quán)限UI:Search
包含擁有快速訪問(wèn)搜索欄以及搜索頁(yè)面所需要的權(quán)限Repo: all repositories(read)
給予用戶讀取所有倉(cāng)庫(kù)的權(quán)限Repo: all repositories(full control)
給予用戶完全控制所有倉(cāng)庫(kù)內(nèi)容的權(quán)限
至此nexus
的一些常用知識(shí)也就介紹完了,下面是一個(gè)實(shí)際項(xiàng)目配置方式講解
項(xiàng)目實(shí)戰(zhàn)
需求:
- 設(shè)置所有項(xiàng)目都從私服中下載構(gòu)件(也需要屏蔽對(duì)中央倉(cāng)庫(kù)的訪問(wèn))
- 為項(xiàng)目單獨(dú)創(chuàng)建倉(cāng)庫(kù) release,snapshot版本分別對(duì)應(yīng)灾票,同時(shí)只允許該項(xiàng)目小組的人員對(duì)該項(xiàng)目倉(cāng)庫(kù)有操作權(quán)限
解決方式: -
nexus
控制臺(tái)添加Public All Repositories
分組峡谊,將包含所有Release/Snapshot
倉(cāng)庫(kù),主要是為了后面鏡像轉(zhuǎn)發(fā)所有請(qǐng)求,同時(shí)為項(xiàng)目創(chuàng)建Release
,Snapshot
倉(cāng)庫(kù)
- 項(xiàng)目
pom
中配置部署信息,主要是為了方便部署項(xiàng)目到nexus
<distributionManagement>
<repository>
<id>mvn-study-releases</id>
<name>Mvn Study Project Release Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-releases/</url>
</repository>
<snapshotRepository>
<id>mvn-study-snapshots</id>
<name>Mvn Study Project Releases Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- 設(shè)置
maven
配置文件settings.xml
,屏蔽中央倉(cāng)庫(kù)訪問(wèn)靖苇, 將所有請(qǐng)求轉(zhuǎn)發(fā)到私服席噩,并設(shè)置指定倉(cāng)庫(kù)的訪問(wèn)權(quán)限
<!--設(shè)置項(xiàng)目倉(cāng)庫(kù)訪問(wèn)權(quán)限,與項(xiàng)目中引用的倉(cāng)庫(kù)對(duì)應(yīng)-->
<servers>
<server>
<id>mvn-study-releases</id>
<username>zhenlian</username>
<password>123456</password>
</server>
<server>
<id>mvn-study-snapshots</id>
<username>zhenglian</username>
<password>123456</password>
</server>
</servers>
<!--將所有請(qǐng)求轉(zhuǎn)發(fā)到私服 -->
<mirrors>
<mirror>
<id>nexus</id>
<name>Local Nexus Mirror</name>
<url>http://localhost:8081/nexus/content/groups/public-all/</url>
<mirrorOf> * </mirrorOf>
</mirror>
</mirrors>
<!--覆蓋對(duì)中央倉(cāng)庫(kù)的訪問(wèn)-->
<profiles>
<!--這里配置倉(cāng)庫(kù)覆蓋中央倉(cāng)庫(kù)-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<!--此時(shí)的url已經(jīng)沒(méi)用了贤壁,因?yàn)檎?qǐng)求被mirror轉(zhuǎn)發(fā)到私服了-->
<url>http://central/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pulginRepositories>
<pluginRepository>
<id>central</id>
<name>Nexus</name>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pulginRepositories>
</profile>
</profiles>
<!--啟動(dòng)nexus本機(jī)倉(cāng)庫(kù)-->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
這里我要啰嗦兩句悼枢,剛開(kāi)始我在實(shí)際部署項(xiàng)目時(shí)總是遇到Return Code 400
,Bad Request
錯(cuò)誤脾拆,檢查了一下倉(cāng)庫(kù)配置馒索,是忽略了在創(chuàng)建Mvn Study Snapshot Repository
時(shí)Deployment Policy(Allow Redeploy) Repository Policy(Snapshot)
好了,今天就到這里啦名船,0:47绰上,又搞到這么晚,趕緊睡覺(jué)為明天黑色周五做準(zhǔn)備G铡r诳椤!