微笑面對每一天,耶!!!咳咳下面的同學(xué)不要講話啦,開始上課啦
這一章,我們來講講私服的知識,私服是
maven
的重要組件,但它并不是maven
內(nèi)部的核心概念,它僅僅是一種衍生出來的特殊maven
倉庫在前面的章節(jié)中已經(jīng)提到,使用私服可以起到如降低中央倉庫負(fù)荷,節(jié)省外網(wǎng)帶寬,加速
maven
構(gòu)建,自己部署構(gòu)建等作用maven
私服種類很多,流行的也有幾個(gè),但這里我就不一一做講解了,下面將主要對nexus
私服做詳細(xì)介紹,其他私服的功能和nexus
也是相似的,有機(jī)會可以自己下去了解一下nexus
是一款不錯(cuò)的倉庫管理軟件,這里主要對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è)文件夾
圖片1.png
nexus-2.14.3-02
該目錄包含了nexus
運(yùn)行所需的文件,比如啟動(dòng)腳本,依賴等
sonatype-work
該目錄是運(yùn)行時(shí)目錄,用于生成運(yùn)行時(shí)所需要的配置文件,日志文件倉庫文件等
nexus-2.14.3-02
該目錄包含了nexus
運(yùn)行所需的文件,比如啟動(dòng)腳本,依賴等
sonatype-work
該目錄是運(yùn)行時(shí)目錄,用于生成運(yùn)行時(shí)所需要的配置文件,日志文件倉庫文件等
通過管理員命令行工具進(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ù)控制臺),這時(shí)可以在控制臺中看到nexus
服務(wù)已經(jīng)生成
圖片2.png
當(dāng)然nexus.bat
其中提供了幾個(gè)常用的命令
install
安裝nexus
服務(wù)
uninstall
卸載nexus
服務(wù)
start
啟動(dòng)nexus
服務(wù)
stop
停止nexus
服務(wù)
restart
重啟nexus
服務(wù) - 登錄到
nexus
控制臺
nexus
服務(wù)啟動(dòng)完成后,我們可以通過瀏覽器輸入http://localhost:8081/nexus
訪問nexus
控制臺,可以通過管理員(admin/admin123
)用戶登錄到控制臺
運(yùn)行后,下面將會對控制臺各個(gè)功能模塊進(jìn)行講解,并提供一個(gè)從項(xiàng)目代碼到倉庫的完整配置過程
nexus倉庫與倉庫組(repository)
作為maven
的倉庫服務(wù)軟件,倉庫自然是nexus
最重要的概念,nexus
包含幾種類型的倉庫:代理倉庫,宿主倉庫和倉庫組等
nexus內(nèi)置倉庫
打開nexus
控制臺左側(cè)Repositories
可以看到maven
中已經(jīng)創(chuàng)建了幾種倉庫
Central
該倉庫代理中央倉庫,其策略為release
,因此只會下載中央倉庫的發(fā)布版本Releases
這是一個(gè)策略為release
的宿主倉庫,用來部署組織內(nèi)部的發(fā)布版本構(gòu)件Snapshots
這是一個(gè)策略為snapshots
的宿主倉庫,用來部署組織內(nèi)部的快照版本構(gòu)件3rd party
這是一個(gè)策略為release
的宿主倉庫,用來部署無法從遠(yuǎn)程倉庫下載的第三方發(fā)布版本構(gòu)件Apache Snapshots
這是一個(gè)策略為snapshots
的代理倉庫,用來專門代理apache maven
倉庫的快照版本構(gòu)件Public Repositories
倉庫組將上述所有策略為release
的倉庫聚合并通過一致性的地址提供服務(wù),當(dāng)然這里可以配置將倉庫加入到組中上面的這些倉庫是如何被使用的呢?
舉個(gè)例子,項(xiàng)目
X
依賴于很多流行的開源類庫如junit
,這些構(gòu)件都可以從中央倉庫獲取,因此central
代理倉庫就會被用來代理中央倉庫,并從中央倉庫下載指定依賴并緩存到私服中,X
項(xiàng)目還依賴了Oracle
的jdbc
驅(qū)動(dòng),由于版權(quán)因素,無法從公共倉庫中獲取,因此公司管理員將其部署到3rd party
倉庫中供X
使用,X
項(xiàng)目的快照版本構(gòu)件成功后會被部署到Snapshots
倉庫供其他小組使用,當(dāng)X
發(fā)布正式版本的時(shí)候,其構(gòu)件將會發(fā)布到Releases
倉庫中,由于X
項(xiàng)目用到了很多倉庫,為每一個(gè)倉庫聲明配置又很麻煩,所以可以統(tǒng)一使用倉庫組Public Repositories
和Public Snapshots Repositories
maven
倉庫分類的概念
下圖更直觀的展現(xiàn)了代理倉庫、宿主倉庫、倉庫組他們之間的關(guān)系
創(chuàng)建宿主倉庫
點(diǎn)擊左側(cè)Repositories
->Add
->Hosted Repositories
就會出現(xiàn)一個(gè)表單
Repository Policy
屬性,指定倉庫的發(fā)布類型有Snapshot
,Release
兩種Deployment Policy
屬性,默認(rèn)是Disable Redeploy
,也就是不允許部署,如果需要部署則需要改為Allow Redeploy
,不然項(xiàng)目發(fā)布時(shí)會報(bào)錯(cuò)Allow File Browsing
屬性,是否允許瀏覽倉庫中的內(nèi)容,一般為true
, 每一個(gè)倉庫創(chuàng)建完成后都會有一個(gè)Browse Storage
,在其中以樹形方式羅列了當(dāng)前倉庫的存儲文件內(nèi)容Include in Search
屬性,表示是否對該倉庫進(jìn)行索引并提供搜索服務(wù),一般為true
Publish URL
屬性,用來控制是否通過url
提供服務(wù),如果選false
,當(dāng)訪問該倉庫時(shí)會得到http 404 Not Found
錯(cuò)誤Not Found Cache TTL
表示當(dāng)一個(gè)文件沒有找到后,緩存這一不存在信息的時(shí)間,默認(rèn)值為1440
分鐘內(nèi)(也就是一天),在規(guī)定的時(shí)間內(nèi)如果nexus
再次得到該文件的請求,那么它將直接返回不存在信息
創(chuàng)建nexus代理倉庫
前面的參數(shù)和宿主倉庫一致,這里我只強(qiáng)調(diào)代理倉庫的一些特定參數(shù)
Remote Storage Location
設(shè)置被代理的遠(yuǎn)程倉庫地址Download Remote Indexes
是否下載遠(yuǎn)程倉庫的index
索引文件,下載索引后即使倉庫中沒有緩存指定的依賴,也可以在nexus
中搜索得到依賴pom
Checksum Policy
設(shè)置當(dāng)依賴校驗(yàn)出錯(cuò)時(shí)的處理方式,可以設(shè)置忽略、記錄警告信息,拒絕下載Artifact Max Age
表示構(gòu)件緩存的時(shí)間,對于release
版本來說為-1
,表示一經(jīng)下載就一直保存,對于snapshots
來說,每隔一天就需要重新緩存代理構(gòu)件Metadata Max Age
表示元配置文件的緩存時(shí)間
創(chuàng)建nexus倉庫組
倉庫組并不是一個(gè)實(shí)實(shí)在在存在的東西,而是一個(gè)虛擬出來的東西,它并沒有Release
與Snapshot
之分,倉庫組中包含的倉庫順序決定了倉庫組遍歷所含倉庫的次序,最好將常用的倉庫放在前面
nexus索引與構(gòu)件搜索
在nexus
中為了能夠?qū)}庫中的構(gòu)件進(jìn)行搜索服務(wù),需要我們將倉庫配置中的Download Remote indexes
設(shè)置為true
,當(dāng)修改了這個(gè)設(shè)置后,我們可以點(diǎn)擊左側(cè)Scheduled Tasks
查看當(dāng)前任務(wù)進(jìn)度情況
當(dāng)完成索引的下載之后,我們可以在倉庫的Browser Storage
選項(xiàng)卡中查看當(dāng)前倉庫的索引結(jié)構(gòu),然后我們就可以在左側(cè)導(dǎo)航欄的Archive Search
輸入框中搜索我們需要的構(gòu)件了
nexus
提供了幾種搜索方式,常用的如keyword search
, GAV Search
(用戶通過設(shè)置groupid
,artifactId
,version
)進(jìn)行搜索操作
部署構(gòu)建到nexus私服中
nexus
提供了兩種方式將構(gòu)建部署到私服中,一種是通過maven
自動(dòng)部署,需要借助distributeMangement
,另一種是直接上傳jar包
通過distributeManagement
自動(dòng)部署構(gòu)件
在日常開發(fā)中,我們可以將項(xiàng)目的snapshot
發(fā)布到項(xiàng)目snapshot
倉庫中,發(fā)布版發(fā)布到release
倉庫中,這需要在項(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>
如果給定的倉庫設(shè)置了訪問權(quán)限,比如mvn-study
該項(xiàng)目建立的snapshot
,只有mvn-study-deployer
角色有操作權(quán)限,所以我們還需要為其添加權(quán)限,這需要在.m2/settings.xml
中添加訪問權(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包到倉庫
這是比較傳統(tǒng)的一種方式,比如我們在公共倉庫中無法找到的第三方依賴,可以通過此方法上傳到私服中,maven3
中,只有release
倉庫允許用戶上傳依賴
在倉庫的配置項(xiàng)中,有一個(gè)artifact upload
選項(xiàng)頁
我們需要添加
GAV Definition
,也就是當(dāng)前jar
的坐標(biāo)信息,然后上傳給定的依賴jar
包
nexus權(quán)限管理
在組織中使用nexus
往往會有一些權(quán)限要求,例如只有管理員才能配置nexus
,只有某些團(tuán)隊(duì)成員才能部署構(gòu)件
nexus訪問控制模型
nexus
是基于權(quán)限(privileges
)做訪問控制的, 服務(wù)器的每一個(gè)資源都有相應(yīng)的權(quán)限來控制,這些權(quán)限的分發(fā)又是通過角色來實(shí)現(xiàn)的,用戶可以被賦予多個(gè)角色,角色也可以配置多個(gè)權(quán)限,角色同時(shí)還可以包含其他角色
nexus
默認(rèn)創(chuàng)建了三個(gè)用戶:admin
擁有對nexus
的完全控制,密碼為admin123
deployment
可以對倉庫內(nèi)容瀏覽、搜索、上傳、部署,但是無法配置nexus
anonymous
只能瀏覽和搜索倉庫,但是不能下載nexus
中同時(shí)預(yù)定義了一些常用且重要的角色:UI:Basic UI Privileges
包含對nexus
界面必須的最基本權(quán)限UI:Repository Browser
包含瀏覽倉庫頁面所需要的權(quán)限UI:Search
包含擁有快速訪問搜索欄以及搜索頁面所需要的權(quán)限Repo: all repositories(read)
給予用戶讀取所有倉庫的權(quán)限Repo: all repositories(full control)
給予用戶完全控制所有倉庫內(nèi)容的權(quán)限
至此nexus
的一些常用知識也就介紹完了,下面是一個(gè)實(shí)際項(xiàng)目配置方式講解
項(xiàng)目實(shí)戰(zhàn)
需求:
- 設(shè)置所有項(xiàng)目都從私服中下載構(gòu)件(也需要屏蔽對中央倉庫的訪問)
- 為項(xiàng)目單獨(dú)創(chuàng)建倉庫 release,snapshot版本分別對應(yīng),同時(shí)只允許該項(xiàng)目小組的人員對該項(xiàng)目倉庫有操作權(quán)限
解決方式: -
nexus
控制臺添加Public All Repositories
分組,將包含所有Release/Snapshot
倉庫,主要是為了后面鏡像轉(zhuǎn)發(fā)所有請求,同時(shí)為項(xiàng)目創(chuàng)建Release
,Snapshot
倉庫
- 項(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
,屏蔽中央倉庫訪問, 將所有請求轉(zhuǎn)發(fā)到私服,并設(shè)置指定倉庫的訪問權(quán)限
<!--設(shè)置項(xiàng)目倉庫訪問權(quán)限,與項(xiàng)目中引用的倉庫對應(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>
<!--將所有請求轉(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>
<!--覆蓋對中央倉庫的訪問-->
<profiles>
<!--這里配置倉庫覆蓋中央倉庫-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<!--此時(shí)的url已經(jīng)沒用了,因?yàn)檎埱蟊籱irror轉(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ī)倉庫-->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
這里我要啰嗦兩句,剛開始我在實(shí)際部署項(xiàng)目時(shí)總是遇到Return Code 400
,Bad Request
錯(cuò)誤,檢查了一下倉庫配置,是忽略了在創(chuàng)建Mvn Study Snapshot Repository
時(shí)Deployment Policy(Allow Redeploy) Repository Policy(Snapshot)
好了,今天就到這里啦,0:47,又搞到這么晚,趕緊睡覺為明天黑色周五做準(zhǔn)備!!!