Maven使用Nexus創(chuàng)建私服的實(shí)現(xiàn)
私服不是Maven的核心概念,它僅僅是一種衍生出來(lái)的特殊的Maven倉(cāng)庫(kù)。通過(guò)建立自己的私服,就可以降低中央倉(cāng)庫(kù)負(fù)荷、節(jié)省外網(wǎng)帶寬、加速M(fèi)aven構(gòu)建、自己部署構(gòu)件等,從而高效地使用Maven。
有三種專門的Maven倉(cāng)庫(kù)管理軟件可以用來(lái)幫助大家建立私服:Apache基金會(huì)的Archiva、JFrog的Artifactory和Sonatype的Nexus。其中,Archiva是開源的,而Artifactory和Nexus的核心也是開源的,因此我們可以自由選擇使用。事實(shí)上,Nexus也是當(dāng)前最流行的Maven倉(cāng)庫(kù)管理軟件。
紹Nexus的主要功能,并結(jié)合大量圖片幫助大家快速地建立起自己的Maven私服。
1、Nexus簡(jiǎn)介
2005年12月,Tamas Cservenak由于受不了匈牙利電信ADSL的低速度,開始著手開發(fā)Proximity——一個(gè)很簡(jiǎn)單的Web應(yīng)用。它可以代理并緩存Maven構(gòu)件,當(dāng)Maven需要下載構(gòu)件的時(shí)候,就不需要反復(fù)依賴于ADSL。到2007年,Sonatype邀請(qǐng)Tamas參與創(chuàng)建一個(gè)更酷的Maven倉(cāng)庫(kù)管理軟件,這就是后來(lái)的Nexus。
Nexus團(tuán)隊(duì)的成員來(lái)自世界各地,它也從社區(qū)收到了大量反饋和幫助,在寫本書的時(shí)候,Nexus剛發(fā)布1.7.2版本,它也正健康快速地成長(zhǎng)著。
Nexus分為開源版和專業(yè)版,其中開源版本基于GPLv3許可證,其特性足以滿足大部分Maven用戶的需要。以下是一些Nexus開源版本的特性:
- 較小的內(nèi)存占用(最少僅為28MB)
- 基于ExtJS的友好界面
- 基于Restlet的完全REST API支持代理倉(cāng)庫(kù)、宿主倉(cāng)庫(kù)和倉(cāng)庫(kù)組
- 基于文件系統(tǒng),不需要數(shù)據(jù)庫(kù)
- 支持倉(cāng)庫(kù)索引和搜索
- 支持從界面上傳Maven構(gòu)件
- 細(xì)粒度的安全控制
Nexus專業(yè)版本是需要付費(fèi)購(gòu)買的,除了開源版本的所有特性之外,它主要包含一些企業(yè)安全控制、發(fā)布流程控制等需要的特性。感興趣的可以訪問(wèn)該地址了解詳情:http://www.sonatype.com/products/nexus/community
2、安裝Nexus
Nexus是典型的Java Web應(yīng)用,它有兩種安裝包,一種是包含Jetty容器的Bundle包,另一種是不包含Web容器的war包。
2.1、下載Nexus
下載地址:https://download.sonatype.com/nexus
然后將下載的文件上傳到 Linux 系統(tǒng)(我用的系統(tǒng)版本是CentOS7),解壓后即可使用,不需要安裝(這里我放在/opt/nexus目錄下)。
需要注意:Linux 必須提前安裝 JDK。
2.2、啟動(dòng)Nexus
通過(guò)以下命令啟動(dòng):
# 啟動(dòng) /opt/nexus/nexus-3.61.0-02/bin/nexus start # 查看狀態(tài) /opt/nexus/nexus-3.61.0-02/bin/nexus status #停止 /opt/nexus/nexus-3.61.0-02/bin/nexus stop
當(dāng)看到nexus is running的時(shí)候說(shuō)明項(xiàng)目已經(jīng)啟動(dòng)了,默認(rèn)端口號(hào)是8081。如果提示nexus is stopped則說(shuō)明端口被占用了,我們可以更改nexus的默認(rèn)端口號(hào)。其配置在 /opt/nexus/nexus-3.61.0-02/etc目錄下的nexus-default.properties 里面,這里我改成了8090。
接下來(lái)就可以啟動(dòng)訪問(wèn)了:
http://[Linux 服務(wù)器地址]:8090/
ps:這里需要說(shuō)明一下,如果Nexus顯示已經(jīng)啟動(dòng)了,但是訪問(wèn)不到,有可能是端口的對(duì)外防火墻沒(méi)有打開。
開啟防火墻的步驟為:
#首先,確保firewalld已經(jīng)啟動(dòng): sudo systemctl start firewalld #確保firewalld被設(shè)置為開機(jī)啟動(dòng): sudo systemctl enable firewalld #使用firewall-cmd打開一個(gè)端口。例如,要打開TCP的8090端口: sudo firewall-cmd --zone=public --add-port=8090/tcp --permanent #重新加載防火墻以使更改生效: sudo firewall-cmd --reload #如果需要,你也可以驗(yàn)證端口是否已經(jīng)開放: sudo firewall-cmd --zone=public --list-ports
Nexus首頁(yè)如下,第一次需要登錄,然后修改初始密碼。
用戶名:admin 初始密碼:在/opt/nexus/sonatype-work/nexus3/admin.password 文件里
3、Nexus的倉(cāng)庫(kù)與倉(cāng)庫(kù)組
作為Maven倉(cāng)庫(kù)服務(wù)軟件,倉(cāng)庫(kù)自然是Nexus中最重要的概念。Nexus包含了各種類型的倉(cāng)庫(kù)概念,包括代理倉(cāng)庫(kù)、宿主倉(cāng)庫(kù)和倉(cāng)庫(kù)組等。每一種倉(cāng)庫(kù)都提供了豐富實(shí)用的配置參數(shù),方便用戶根據(jù)需要進(jìn)行定制。
3.1、Nexus內(nèi)置的倉(cāng)庫(kù)
在具體介紹每一種類型的倉(cāng)庫(kù)之前,先瀏覽一下Nexus內(nèi)置的一些倉(cāng)庫(kù)。單擊Nexus界面左邊導(dǎo)航欄中的Repositories鏈接,就能在界面右邊看到如下圖所示的內(nèi)容:
這個(gè)列表已經(jīng)包含了所有類型的Nexus倉(cāng)庫(kù)。從中可以看到倉(cāng)庫(kù)有四種類型:group(倉(cāng)庫(kù)組)、hosted(宿主)、proxy(代理)和virtual(虛擬):
倉(cāng)庫(kù)類型 | 說(shuō)明 |
---|---|
proxy | 某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的代理 |
group | 存放:通過(guò) Nexus 獲取的第三方 jar 包 |
hosted | 存放:本團(tuán)隊(duì)其他開發(fā)人員部署到 Nexus 的 jar 包 |
每個(gè)倉(cāng)庫(kù)的格式為maven2或者maven1。此外,倉(cāng)庫(kù)還有一個(gè)屬性為Policy(策略),表示該倉(cāng)庫(kù)為發(fā)布(Release)版本倉(cāng)庫(kù)還是快照(Snapshot)版本倉(cāng)庫(kù)。最后兩列的值為倉(cāng)庫(kù)的狀態(tài)和路徑。
下面解釋一下各個(gè)倉(cāng)庫(kù)的用途:
倉(cāng)庫(kù)名稱 | 說(shuō)明 |
---|---|
maven-central | Nexus 對(duì) Maven 中央倉(cāng)庫(kù)的代理,其策略為Release,因此只會(huì)下載和緩存中央倉(cāng)庫(kù)中的發(fā)布版本構(gòu)件。 |
maven-public | Nexus 默認(rèn)創(chuàng)建,供開發(fā)人員下載使用的組倉(cāng)庫(kù) |
maven-releasse | Nexus 默認(rèn)創(chuàng)建,供開發(fā)人員部署自己 jar 包的宿主倉(cāng)庫(kù),要求 releasse 版本 |
maven-snapshots | Nexus 默認(rèn)創(chuàng)建,供開發(fā)人員部署自己 jar 包的宿主倉(cāng)庫(kù),要求 snapshots 版本 |
其中 maven-public 相當(dāng)于倉(cāng)庫(kù)總和,默認(rèn)把其他 3 個(gè)倉(cāng)庫(kù)加進(jìn)來(lái)一起對(duì)外提供服務(wù)了,另外,如果有自己建的倉(cāng)庫(kù),也要加進(jìn)該倉(cāng)庫(kù)才有用。
3.2、Nexus倉(cāng)庫(kù)分類的概念
為了幫助大家理解宿主倉(cāng)庫(kù)、代理倉(cāng)庫(kù)和倉(cāng)庫(kù)組的概念,下圖用更為直觀的方式展現(xiàn)了它們的用途和區(qū)別:
從上圖中可以看到,Maven可以直接從宿主倉(cāng)庫(kù)下載構(gòu)件;Maven也可以從代理倉(cāng)庫(kù)下載構(gòu)件,而代理倉(cāng)庫(kù)會(huì)間接地從遠(yuǎn)程倉(cāng)庫(kù)下載并緩存構(gòu)件;最后,為了方便,Maven可以從倉(cāng)庫(kù)組下載構(gòu)件,而倉(cāng)庫(kù)組沒(méi)有實(shí)際內(nèi)容(圖中用虛線表示),它會(huì)轉(zhuǎn)向其包含的宿主倉(cāng)庫(kù)或者代理倉(cāng)庫(kù)獲得實(shí)際構(gòu)件的內(nèi)容。
3.3、創(chuàng)建倉(cāng)庫(kù)
初始狀態(tài)下,這幾個(gè)倉(cāng)庫(kù)都沒(méi)有內(nèi)容:
除了自帶的倉(cāng)庫(kù),有時(shí)候我們需要單獨(dú)創(chuàng)建自己的倉(cāng)庫(kù),按照默認(rèn)創(chuàng)建的倉(cāng)庫(kù)類型來(lái)創(chuàng)建我們自己的倉(cāng)庫(kù)。
點(diǎn)擊Create Repository:
選擇如下三種類型的倉(cāng)庫(kù):
1、創(chuàng)建Nexus宿主倉(cāng)庫(kù)
2、創(chuàng)建Nexus代理倉(cāng)庫(kù)
輸入倉(cāng)庫(kù)名以及被代理倉(cāng)庫(kù)的URL,這里我輸入阿里云的倉(cāng)庫(kù)地址,默認(rèn)為中央倉(cāng)庫(kù)。
3、創(chuàng)建Nexus倉(cāng)庫(kù)組
配置中的ID、Name等信息這里不再贅述。需要注意的是,倉(cāng)庫(kù)組沒(méi)有Release和Snapshot的區(qū)別,這不同于宿主倉(cāng)庫(kù)和代理倉(cāng)庫(kù)。在配置界面中,用戶可以非常直觀地選擇Nexus中的倉(cāng)庫(kù),將其聚合成一個(gè)虛擬的倉(cāng)庫(kù)組。注意,倉(cāng)庫(kù)組所包含的倉(cāng)庫(kù)的順序決定了倉(cāng)庫(kù)組遍歷其所含倉(cāng)庫(kù)的次序,因此最好將常用的倉(cāng)庫(kù)放在前面,當(dāng)用戶從倉(cāng)庫(kù)組下載構(gòu)件的時(shí)候,就能夠盡快地訪問(wèn)到包含構(gòu)件的倉(cāng)庫(kù)。
上面的倉(cāng)庫(kù)創(chuàng)建好之后就可以在首頁(yè)看到了:
4、Nexus的索引與構(gòu)件搜索
既然Nexus能夠維護(hù)宿主倉(cāng)庫(kù)并代理緩存遠(yuǎn)程倉(cāng)庫(kù)(如Maven中央庫(kù)),那么一個(gè)簡(jiǎn)單的需求就自然浮現(xiàn)出來(lái)了,這就是搜索。Maven中央庫(kù)有幾十萬(wàn)構(gòu)件供用戶使用,但有時(shí)我們往往僅僅知道某個(gè)關(guān)鍵字,如Ehcache,而不知道其確切的Maven坐標(biāo)。Nexus通過(guò)維護(hù)倉(cāng)庫(kù)的索引來(lái)提供搜索功能,能在很大程度上方便Maven用戶定位構(gòu)件坐標(biāo)。
Sonatype提供的在線免費(fèi)搜索服務(wù),其實(shí)用戶可以很方便地自己維護(hù)一個(gè)Nexus實(shí)例,并提供搜索服務(wù)。
為了能夠搜索Maven中央庫(kù),首先需要設(shè)置Nexus中的Maven Central代理倉(cāng)庫(kù)下載遠(yuǎn)程索引,如下圖所示。需要注意的是,默認(rèn)這個(gè)配置的值是關(guān)閉的。此外,由于中央庫(kù)的內(nèi)容比較多,因此其索引文件比較大,Nexus下載該文件也需要比較長(zhǎng)的時(shí)間,大家還需要耐心等待。
可以想象到,Nexus在后臺(tái)運(yùn)行了一個(gè)任務(wù)來(lái)下載中央倉(cāng)庫(kù)的索引,幸運(yùn)的是,用戶可以通過(guò)界面直接觀察這一任務(wù)的狀態(tài)。單擊界面左邊導(dǎo)航欄中的Scheduled Tasks鏈接后,用戶就能在界面的右邊看到系統(tǒng)的調(diào)度任務(wù),如果Nexus正在下載中央倉(cāng)庫(kù)的索引,用戶就能看到下圖所示的一個(gè)任務(wù),其狀態(tài)為RUNNING。在索引下載完畢之后,該任務(wù)就會(huì)消失。
有了索引,用戶即可搜索Maven構(gòu)件了。Nexus界面左邊導(dǎo)航欄有一個(gè)快捷搜索框,在其中輸入關(guān)鍵字后,單擊搜索按鈕就能快速得到搜索結(jié)果,如下圖所示:
除了簡(jiǎn)單的關(guān)鍵字搜索,Nexus還提供了GAV搜索、類名搜索和校驗(yàn)和搜索等功能,用戶可以單擊搜索頁(yè)面左上角的下拉菜單選擇高級(jí)搜索功能:
- GAV搜索(GAV Search)允許用戶通過(guò)設(shè)置GroupId、ArtifactId和Version等信息來(lái)進(jìn)行更有針對(duì)性的搜索。
- 類名搜索(Classname Search)允許用戶搜索包含某個(gè)Java類的構(gòu)件。
- 校驗(yàn)和搜索(Checksum Search)允許用戶直接使用構(gòu)件的校驗(yàn)和來(lái)搜索該構(gòu)件。
當(dāng)然,用戶也可以自己手動(dòng)輸入GroupId、ArtifactId等信息來(lái)進(jìn)行GAV搜索。
有了中央倉(cāng)庫(kù)的索引,用戶不僅能夠搜索構(gòu)件,還能夠直接瀏覽中央倉(cāng)庫(kù)的內(nèi)容。這便是Nexus的索引瀏覽功能。在Repositories頁(yè)面中,選擇Browse Index選項(xiàng)卡,就能看到中央倉(cāng)庫(kù)內(nèi)容的樹形結(jié)構(gòu),如下圖所示:
5、配置Maven從Nexus下載構(gòu)件
在POM中為Maven配置倉(cāng)庫(kù)和插件倉(cāng)庫(kù)。例如,當(dāng)需要為項(xiàng)目添加Nexus私服上的public倉(cāng)庫(kù)時(shí),可以按代碼清單如下所示配置,在POM中配置Nexus倉(cāng)庫(kù):
<project> …… <repositories> <repository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> …… </project>
這樣的配置只對(duì)當(dāng)前Maven項(xiàng)目有效,在實(shí)際應(yīng)用中,我們往往想要通過(guò)一次配置就能讓本機(jī)所有的Maven項(xiàng)目都使用自己的Maven私服。這個(gè)時(shí)候大家可能會(huì)想到settings.xml文件,該文件中的配置對(duì)所有本機(jī)Maven項(xiàng)目有效,但是settings.xml并不支持直接配置repositories和pluginRepositories。所幸Maven還提供了Profile機(jī)制,能讓用戶將倉(cāng)庫(kù)配置放到setting.xml中的Profile中,如代碼清單如下所示:
在settings.xml中配置Nexus倉(cāng)庫(kù):
<settings> …… <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> ……</settings>
該配置中使用了一個(gè)id為nexus的profile,這個(gè)profile包含了相關(guān)的倉(cāng)庫(kù)配置,同時(shí)配置中又使用activeProfile元素將nexus這個(gè)profile激活,這樣當(dāng)執(zhí)行Maven構(gòu)建的時(shí)候,激活的profile會(huì)將倉(cāng)庫(kù)配置應(yīng)用到項(xiàng)目中去。
上面代碼清單中的配置已經(jīng)能讓本機(jī)所有的Maven項(xiàng)目從Nexus私服下載構(gòu)件。細(xì)心的人可能會(huì)注意到,Maven除了從Nexus下載構(gòu)件之外,還會(huì)不時(shí)地訪問(wèn)中央倉(cāng)庫(kù)central,我們希望的是所有Maven下載請(qǐng)求都僅僅通過(guò)Nexus,以全面發(fā)揮私服的作用。這個(gè)時(shí)候就需要借助于Maven鏡像配置了??梢詣?chuàng)建一個(gè)匹配任何倉(cāng)庫(kù)的鏡像,鏡像的地址為私服,這樣,Maven對(duì)任何倉(cāng)庫(kù)的構(gòu)件下載請(qǐng)求都會(huì)轉(zhuǎn)到私服中。具體配置見代碼清單如下所示,配置鏡像讓Maven只使用私服:
<settings> ……<mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public</url> </mirror> </mirrors> <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>central</id> <url>http://central</url> <releases> <enabled>true</enabled> </releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases> <enabled>true</enabled> </releases><snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> …… </settings>
關(guān)于鏡像、profile及profile激活的配置不再贅述,這里需要解釋的是倉(cāng)庫(kù)及插件倉(cāng)庫(kù)配置,它們的id都為central,也就是說(shuō),覆蓋了超級(jí)POM中央倉(cāng)庫(kù)的配置,它們的url已無(wú)關(guān)緊要,因?yàn)樗姓?qǐng)求都會(huì)通過(guò)鏡像訪問(wèn)私服地址。配置倉(cāng)庫(kù)及插件倉(cāng)庫(kù)的主要目的是開啟對(duì)快照版本下載的支持,當(dāng)Maven需要下載發(fā)布版或快照版構(gòu)件的時(shí)候,它首先檢查central,看該類型的構(gòu)件是否支持,得到正面的回答之后,再根據(jù)鏡像匹配規(guī)則轉(zhuǎn)而訪問(wèn)私服倉(cāng)庫(kù)地址。
6、部署構(gòu)件至Nexus
如果只為代理外部公共倉(cāng)庫(kù),那么Nexus的代理倉(cāng)庫(kù)就已經(jīng)能夠完全滿足需要了。對(duì)于另一類Nexus倉(cāng)庫(kù)——宿主倉(cāng)庫(kù)來(lái)說(shuō),它們的主要作用是儲(chǔ)存組織內(nèi)部的,或者一些無(wú)法從公共倉(cāng)庫(kù)中獲得的第三方構(gòu)件,供大家下載使用。用戶可以配置Maven自動(dòng)部署構(gòu)件至Nexus的宿主倉(cāng)庫(kù),也可以通過(guò)界面手動(dòng)上傳構(gòu)件。
6.1、使用Maven部署構(gòu)件至Nexus
日常開發(fā)生成的快照版本構(gòu)件可以直接部署到Nexus中策略為Snapshot的宿主倉(cāng)庫(kù)中,項(xiàng)目正式發(fā)布的構(gòu)件則應(yīng)該部署到Nexus中策略為Release的宿主倉(cāng)庫(kù)中。POM的配置方式,下面的代碼清單列出了一段典型的配置,配置Maven部署構(gòu)件至Nexus:
<project> …… <distributionManagement> <repository> <id>nexus-releases</id> <name>Nexus Releases Repository</name> <url>http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshots Repository</name> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> …… </project>
Nexus的倉(cāng)庫(kù)對(duì)于匿名用戶是只讀的。為了能夠部署構(gòu)件,還需要在settings.xml中配置認(rèn)證信息,如代碼清單如下所示:
<settings> …… <servers> <server> <id>nexus-releases</id> <username>admin</username> <password>*****</password> </server> <server> <id>nexus-snapshots</id> <username>admin</username> <password>*****</password> </server></servers> …… </settings>
6.2、手動(dòng)部署第三方構(gòu)件至Nexus
某些Java Jar文件(如Oracle)的JDBC驅(qū)動(dòng),由于許可證的因素,它們無(wú)法公開地放在公共倉(cāng)庫(kù)中。此外,還有大量的小型開源項(xiàng)目,它們沒(méi)有把自己的構(gòu)件分發(fā)到中央倉(cāng)庫(kù)中,也沒(méi)有維護(hù)自己的倉(cāng)庫(kù),因此也無(wú)法從公共倉(cāng)庫(kù)獲得。這個(gè)時(shí)候用戶就需要將這類構(gòu)件手動(dòng)下載到本地,然后通過(guò)Nexus的界面上傳到私服中。
要上傳第三方構(gòu)件,首先選擇一個(gè)宿主倉(cāng)庫(kù)如3rd party,然后在頁(yè)面的下方選擇Artifact Upload選項(xiàng)卡。在上傳構(gòu)件的時(shí)候,Nexus要求用戶確定其Maven坐標(biāo),如果該構(gòu)件是通過(guò)Maven構(gòu)建的,那么可以在GAV Definition下拉列表中選擇From POM,否則就選GAV Parameters。用戶需要為該構(gòu)件定義一個(gè)Maven坐標(biāo),例如上傳一個(gè)Oracle 11g的JDBC驅(qū)動(dòng),則可以按下圖所示輸入坐標(biāo):
定義好坐標(biāo)之后,單擊Select Artifact(s)to Upload按扭從本機(jī)選擇要上傳的構(gòu)件,然后單擊Add Artifact按鈕將其加入到上傳列表中。Nexus允許用戶一次上傳一個(gè)主構(gòu)件和多個(gè)附屬構(gòu)件(即Classifier)。最后,單擊頁(yè)面最下方的Upload Artifact(s)按鈕將構(gòu)件上傳到倉(cāng)庫(kù)中。
7、Nexus的權(quán)限管理
在組織中使用Nexus的時(shí)候往往會(huì)有一些安全性需求,例如希望只有管理員才能配置Nexus,只有某些團(tuán)隊(duì)成員才能部署構(gòu)件,或者更細(xì)一些的要求,例如每個(gè)項(xiàng)目都有自己的Nexus宿主倉(cāng)庫(kù),且只能部署項(xiàng)目構(gòu)件至該倉(cāng)庫(kù)中。Nexus提供了全面的權(quán)限控制特性,能讓用戶自由地根據(jù)需要配置Nexus用戶、角色、權(quán)限等。
7.1、Nexus的訪問(wèn)控制模型
Nexus是基于權(quán)限(Privilege)做訪問(wèn)控制的,服務(wù)器的每一個(gè)資源都有相應(yīng)的權(quán)限來(lái)控制,因此用戶執(zhí)行特定的操作時(shí)就必須擁有必要的權(quán)限。管理員必須以角色(Role)的方式將權(quán)限賦予Nexus用戶。例如要訪問(wèn)Nexus界面,就必須擁有Status-(read)這個(gè)權(quán)限,而Nexus默認(rèn)配置的角色UI:Basic UI Privileges就包含了這個(gè)權(quán)限,再將這個(gè)角色分配給某個(gè)用戶,這個(gè)用戶就能訪問(wèn)Nexus界面了。
用戶可以被賦予一個(gè)或者多個(gè)角色,角色可以包含一個(gè)或者多個(gè)權(quán)限,角色還可以包含一個(gè)或者多個(gè)其他角色。
Nexus預(yù)定義了三個(gè)用戶,以admin登錄后,單擊頁(yè)面左邊導(dǎo)航欄中的User鏈接,就能看到所有已定義用戶的列表,如下圖所示:
這三個(gè)用戶對(duì)應(yīng)了三個(gè)權(quán)限級(jí)別:
- admin:該用戶擁有對(duì)Nexus服務(wù)的完全控制,默認(rèn)密碼為admin123。
- deployment:該用戶能夠訪問(wèn)Nexus,瀏覽倉(cāng)庫(kù)內(nèi)容,搜索,并且上傳部署構(gòu)件,但是無(wú)法對(duì)Nexus進(jìn)行任何配置,默認(rèn)密碼為deployment123。
- anonymous:該用戶對(duì)應(yīng)了所有未登錄的匿名用戶,它們可以瀏覽倉(cāng)庫(kù)并進(jìn)行搜索。
理解各個(gè)角色的意義對(duì)于權(quán)限管理至關(guān)重要。Nexus預(yù)定義的一些常用且重要的角色包括:
- UI:Basic UI Privileges:包含了訪問(wèn)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ù)內(nèi)容的權(quán)限,沒(méi)有倉(cāng)庫(kù)的讀權(quán)限,用戶將無(wú)法在倉(cāng)庫(kù)頁(yè)面上看到實(shí)際的倉(cāng)庫(kù)內(nèi)容,也無(wú)法使用Maven從倉(cāng)庫(kù)下載構(gòu)件。
- Repo:All Repositories(Full Control):給予用戶完全控制所有倉(cāng)庫(kù)內(nèi)容的權(quán)限。用戶不僅可以瀏覽、下載構(gòu)件,還可以部署構(gòu)件及刪除倉(cāng)庫(kù)內(nèi)容。
- Nexus包含了一個(gè)特殊的匿名用戶角色(Nexus Anonymous Role),默認(rèn)配置下沒(méi)有登錄的用戶都會(huì)擁有該匿名角色的權(quán)限。這個(gè)匿名用戶角色實(shí)際包含了上述所列角色中,除Repo:All Repositories(Full Control)之外的所有角色所包含的權(quán)限。也就是說(shuō),匿名用戶可以訪問(wèn)基本的Nexus界面、瀏覽倉(cāng)庫(kù)內(nèi)容及搜索構(gòu)件。
除上述角色之外,Nexus還預(yù)定義了很多其他角色,它們往往都對(duì)應(yīng)了一個(gè)Nexus的功能。例如,UI:Logs and Config Files包含了訪問(wèn)系統(tǒng)日志文件及配置文件所需要的權(quán)限。
7.2、為項(xiàng)目分配獨(dú)立的倉(cāng)庫(kù)
在組織內(nèi)部,如果所有項(xiàng)目都部署快照及發(fā)布版構(gòu)件至同樣的倉(cāng)庫(kù),就會(huì)存在潛在的沖突及安全問(wèn)題,我們不想讓項(xiàng)目A的部署影響到項(xiàng)目B,反之亦然。解決的方法就是為每個(gè)項(xiàng)目分配獨(dú)立的倉(cāng)庫(kù),并且只將倉(cāng)庫(kù)的部署、修改和刪除權(quán)限賦予該項(xiàng)目的成員,其他用戶只能讀取、下載和搜索該倉(cāng)庫(kù)的內(nèi)容。
假設(shè)項(xiàng)目名稱為foo,首先為該項(xiàng)目建立兩個(gè)宿主倉(cāng)庫(kù)Foo Snapshots和Foo Releases,分別用來(lái)部署快照構(gòu)件和發(fā)布構(gòu)件。
有了倉(cāng)庫(kù)之后,就需要?jiǎng)?chuàng)建基于倉(cāng)庫(kù)的增、刪、改、查權(quán)限。在Nexus中,這樣的權(quán)限是基于Repository Target建立的,Repository Target實(shí)際上是一系列正則表達(dá)式,在訪問(wèn)倉(cāng)庫(kù)某路徑下內(nèi)容的時(shí)候,Nexus會(huì)將倉(cāng)庫(kù)路徑與Repository Target的正則表達(dá)式一一匹配,以檢查權(quán)限是否正確。
單擊左邊導(dǎo)航欄中的Repository Targets鏈接,就能看到下圖所示的頁(yè)面。圖中選中了All(Maven2)這一Repository Target,在下方可以看到它包含了一個(gè)值為“.*”的正則表達(dá)式,表示該Repository Target能夠匹配倉(cāng)庫(kù)下的任何路徑。
下一步就是基于該Repository Target和Foo Releases、Foo Snapshots兩個(gè)倉(cāng)庫(kù)建立權(quán)限。單擊頁(yè)面左邊導(dǎo)航欄中的Privileges鏈接進(jìn)入權(quán)限頁(yè)面,然后單擊Add按鈕,選擇Repository Target Privilege。下圖所示為創(chuàng)建對(duì)應(yīng)于Foo Releases的權(quán)限。
上圖中選擇了Foo Releases倉(cāng)庫(kù)和All(Maven2),表示創(chuàng)建匹配Foo Releases倉(cāng)庫(kù)任何路徑的權(quán)限。單擊Save按鈕之后,就能在權(quán)限列表中看到相應(yīng)的增、刪、改、查權(quán)限,如下圖所示:
然后,遵循同樣的步驟,為Foo Snapshots建立增、刪、改、查權(quán)限。
下一步是創(chuàng)建一個(gè)包含上述權(quán)限的角色。單擊導(dǎo)航欄中的Roles進(jìn)入角色頁(yè)面,再單擊頁(yè)面上方的Add按鈕并選擇Nexus Role。下圖所示為將之前建立的權(quán)限加入到該角色中。
角色創(chuàng)建完成之后,根據(jù)需要將其分配給Foo項(xiàng)目的團(tuán)隊(duì)成員。這樣,其他團(tuán)隊(duì)的成員默認(rèn)只能讀取Foo Releases和Foo Snapshots的內(nèi)容,而擁有Foo Deployer角色的用戶就可以執(zhí)行部署構(gòu)件等操作。
8、Nexus的調(diào)度任務(wù)
Nexus提供了一系列可配置的調(diào)度任務(wù)來(lái)方便用戶管理系統(tǒng)。用戶可以設(shè)定這些任務(wù)運(yùn)行的方式,例如每天、每周、手動(dòng)等。調(diào)度任務(wù)會(huì)在適當(dāng)?shù)臅r(shí)候在后臺(tái)運(yùn)行。當(dāng)然,用戶還是能夠在界面觀察它們的狀態(tài)的。
要建立一個(gè)調(diào)度任務(wù),單擊左邊導(dǎo)航欄中的Scheduled Tasks鏈接,然后在右邊的界面上方單擊Add按鈕,接著就能看到下圖所示的界面。用戶可以根據(jù)自己的需要,選擇任務(wù)類型,并配置其運(yùn)行方式。
Nexus包含了以下幾種類型的調(diào)度任務(wù):
- Download Indexes:為代理倉(cāng)庫(kù)下載遠(yuǎn)程索引。
- Empty Trash:清空Nexus的回收站,一些操作(如刪除倉(cāng)庫(kù)文件)實(shí)際是將文件移到了回收站中。
- Evict Unused Proxied Items From Repository Caches:刪除代理倉(cāng)庫(kù)中長(zhǎng)期未被使用的構(gòu)件緩存。
- Expire Repository Caches:Nexus為代理倉(cāng)庫(kù)維護(hù)了遠(yuǎn)程倉(cāng)庫(kù)的信息以避免不必要的網(wǎng)絡(luò)流量,該任務(wù)清空這些信息以強(qiáng)制Nexus去重新獲取遠(yuǎn)程倉(cāng)庫(kù)的信息。
- Publish Indexes:將倉(cāng)庫(kù)索引發(fā)布成可供m2eclipse和其他Nexus使用的格式。
- Purge Nexus Timeline:刪除Nexus的時(shí)間線文件,該文件用于建立系統(tǒng)的RSS源。
- Rebuild Maven Metadata Files:基于倉(cāng)庫(kù)內(nèi)容重新創(chuàng)建倉(cāng)庫(kù)元數(shù)據(jù)文件maven-meta-data.xml,同時(shí)重新創(chuàng)建每個(gè)文件的校驗(yàn)和md5和sha1。
- Reindex Repositories:為倉(cāng)庫(kù)編纂索引。
- Remove Snapshots From Repository:以可配置的方式刪除倉(cāng)庫(kù)的快照構(gòu)件。
- Synchronize Shadow Repository:同步虛擬倉(cāng)庫(kù)的內(nèi)容(服務(wù)于Maven 1)。
9、其他私服軟件
Nexus不是唯一的Maven私服軟件,用戶還有另外兩個(gè)選擇,它們分別為Apache的Archiva與JFrog的Artifactory。
Archiva可能是歷史最長(zhǎng)的Maven私服軟件,它早在2005年就作為Apache Maven的一個(gè)子項(xiàng)目存在,到2008年3月成為了Apache軟件基金會(huì)的頂級(jí)項(xiàng)目。
大家可以訪問(wèn)http://archiva.apache.org以具體了解Archiva,其站點(diǎn)提供了一些入門指南及郵件列表等信息。Archiva的下載地址為http://archiva.apache.org/download.html。
10、總結(jié)
建立并維護(hù)自己的私服是使用Maven必不可少的一步,Maven私服軟件有Nexus、Archiva和Artifactory,它們都提供了開源的版本供用戶下載。我們?cè)敿?xì)介紹了Nexus的安裝和使用,包括如何分辨各種類型的倉(cāng)庫(kù)、如何建立倉(cāng)庫(kù)索引和搜索構(gòu)件、如何使用權(quán)限管理功能、如何使用調(diào)度任務(wù)功能等。除了這些功能之外,Nexus還有很多有趣的特性,如RSS源、日志瀏覽及配置等,用戶可以從友好的界面中學(xué)習(xí)使用。
除了Nexus本身,我們還詳述了如何配置Maven從私服下載構(gòu)件,以及如何發(fā)布構(gòu)件至私服供他人使用。結(jié)合了Nexus的幫助之后,再使用Maven時(shí)就會(huì)如虎添翼。
到此這篇關(guān)于Maven使用Nexus創(chuàng)建私服的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Maven Nexus創(chuàng)建私服內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Maven nexus 安裝nexus私服出現(xiàn)的問(wèn)題和解決辦法
- 詳解Maven私服Nexus的安裝與使用
- 如何使用nexus在局域網(wǎng)內(nèi)搭建maven私服及idea的使用
- Maven入門之使用Nexus搭建Maven私服及上傳下載jar包
- 使用Nexus搭建Maven私服的方法步驟
- maven將項(xiàng)目打包上傳到nexus私服的詳細(xì)教程
- 詳解idea maven nexus 常見命令配置
- 利用Docker搭建Nexus私有倉(cāng)庫(kù)實(shí)現(xiàn)Maven私服
- 使用Nexus搭建Maven私服教程的方法步驟
- Maven配置單倉(cāng)庫(kù)與多倉(cāng)庫(kù)的實(shí)現(xiàn)(Nexus)
- Maven發(fā)布項(xiàng)目到Nexus私有服務(wù)器
- Python實(shí)現(xiàn)批量上傳本地maven庫(kù)到nexus
- Maven忽略單元測(cè)試及打包到Nexus的實(shí)現(xiàn)
- maven私有鏡像倉(cāng)庫(kù)nexus部署使用
相關(guān)文章
如何使用?Spring?Boot?搭建?WebSocket?服務(wù)器實(shí)現(xiàn)多客戶端連接
本文介紹如何使用SpringBoot快速搭建WebSocket服務(wù)器,實(shí)現(xiàn)多客戶端連接和消息廣播,WebSocket協(xié)議提供全雙工通信,SpringBoot通過(guò)@ServerEndpoint簡(jiǎn)化配置,支持實(shí)時(shí)消息推送,適用于聊天室或通知系統(tǒng)等應(yīng)用場(chǎng)景2024-11-11通過(guò)實(shí)例解析Spring Ioc項(xiàng)目實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Spring Ioc項(xiàng)目實(shí)踐過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06關(guān)于Springboot+gateway整合依賴并處理依賴沖突問(wèn)題
這篇文章主要介紹了Springboot+gateway整合依賴并處理依賴沖突問(wèn)題,給大家提到了spring boot版本和spring cloud版本,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01Java實(shí)現(xiàn)Executors類創(chuàng)建常見線程池
本文主要介紹了Java實(shí)現(xiàn)Executors類創(chuàng)建常見線程池,在Java中,可以通過(guò)Executors工廠類提供四種常見類型的線程池,下面就來(lái)介紹一下這四種的方法實(shí)現(xiàn),感興趣的可以了解一下2023-11-11復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Mybatis 實(shí)現(xiàn)打印sql語(yǔ)句的代碼
這篇文章主要介紹了Mybatis 實(shí)現(xiàn)打印sql語(yǔ)句的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法
本文主要介紹了詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05