Nexus介紹
Nexus 是Maven倉庫管理器,如果你使用Maven,你可以從Maven中央倉庫 下載所需要的構(gòu)件(artifact),但這通常不是一個(gè)好的做法,你應(yīng)該在本地架設(shè)一個(gè)Maven倉庫服務(wù)器,在代理遠(yuǎn)程倉庫的同時(shí)維護(hù)本地倉庫,以節(jié) 省帶寬和時(shí)間,Nexus就可以滿足這樣的需要。此外,他還提供了強(qiáng)大的倉庫管理功能,構(gòu)件搜索功能,它基于REST,友好的UI是一個(gè)extjs的 REST客戶端,它占用較少的內(nèi)存,基于簡單文件系統(tǒng)而非數(shù)據(jù)庫。這些優(yōu)點(diǎn)使其日趨成為最流行的Maven倉庫管理器。
?
下載和安裝
你可以從http://nexus.sonatype.org/downloads/ 下載最新版本的Nexus,筆者使用的是1.3.0版本。
Nexus提供了兩種安裝方式,一種是內(nèi)嵌Jetty的bundle,只要你有JRE就能直接運(yùn)行。第二種方式是WAR,你只須簡單的將其發(fā)布到web容器中即可使用。
?
Bundle方式安裝
解壓nexus-webapp-1.3.0-bundle.zip 至任意目錄,如D:\dev_tools ,然后打開CMD,cd至目錄D:\dev_tools\nexus-webapp-1.3.0\bin\jsw\windows-x86-32 ,運(yùn)行Nexus.bat 。你會看到Nexus的啟動(dòng)日志,當(dāng)你看到“Started SelectChannelConnector@0.0.0.0:8081”之后,說明Nexus啟動(dòng)成功了,然后打開瀏覽器,訪問 http://127.0.0.1:8081/nexus,你會看到如下的頁面:
要停止Nexus,Ctrl+C即可,此外InstallNexus.bat可以用來將Nexus安裝成一個(gè)windows服務(wù),其余的腳本則對應(yīng)了啟動(dòng),停止,暫停,恢復(fù),卸載Nexus服務(wù)。
?
WAR方式安裝
你需要有一個(gè)能運(yùn)行的web容器,這里以Tomcat為例,加入Tomcat的安裝目錄位于D:\dev_tools\apache-tomcat-6.0.18 ,首先我們將下載的nexus-webapp-1.3.0.war 重命名為nexus.war ,然后復(fù)制到D:\dev_tools\apache-tomcat-6.0.18\webapps\nexus.war ,然后啟動(dòng)CMD,cd到D:\dev_tools\apache-tomcat-6.0.18\bin\ 目錄,運(yùn)行startup.bat 。一切OK,現(xiàn)在可以打開瀏覽器訪問http://127.0.0.1:8080/nexus,你會得到和上圖一樣的界面。
?
代理外部Maven倉庫
登陸
要管理Nexus,你首先需要以管理員身份登陸,點(diǎn)擊界面右上角的login,輸入默認(rèn)的登錄名和密碼:admin/admin123,登陸成功后,你會看到左邊的導(dǎo)航欄增加了很多內(nèi)容:
這里,可以管理倉庫,配置Nexus系統(tǒng),管理任務(wù),管理用戶,角色,權(quán)限,查看系統(tǒng)的RSS源,管理及查看系統(tǒng)日志,等等。你會看到Nexus的功能十分豐富和強(qiáng)大,本文,筆者只介紹一些最基本的管理和操作。
?
代理Maven中央倉庫
點(diǎn)擊左邊導(dǎo)航欄的Repositories,界面的主面板會顯示所有一個(gè)所有倉庫及倉庫組的列表,你會看到它們的Type字段的值有g(shù)roup,hosted,proxy,virtual。這里我們不關(guān)心virtual,只介紹下另外三種類型:
- hosted,本地倉庫,通常我們會部署自己的構(gòu)件到這一類型的倉庫。
- proxy,代理倉庫,它們被用來代理遠(yuǎn)程的公共倉庫,如maven中央倉庫。
- group,倉庫組,用來合并多個(gè)hosted/proxy倉庫,通常我們配置maven依賴倉庫組。
由此我們知道,我們需要配置一個(gè)Maven中央倉庫的proxy,其實(shí)Nexus已經(jīng)內(nèi)置了Maven Central,但我們需要做一些配置。點(diǎn)擊倉庫列表中的Maven Central,你會注意到它的Policy是release,這說明它不會代理遠(yuǎn)程倉庫的snapshot構(gòu)件,這是有原因的,遠(yuǎn)程倉庫的 snapshot版本構(gòu)件不穩(wěn)定且不受你控制,使用這樣的構(gòu)件含有潛在的風(fēng)險(xiǎn)。然后我們發(fā)現(xiàn)主面板下方有三個(gè)Tab,分別為 Browse,Configuration和Mirrors,我們點(diǎn)擊Configuration進(jìn)行配置,你現(xiàn)在需要關(guān)心的是兩個(gè)配置 項(xiàng):“Remote Storage Location”為遠(yuǎn)程倉庫的地址,對于Maven Central來說是http://repo1.maven.org/maven2/;“Download Remote Indexes”顧名思義是指是否下載遠(yuǎn)程索引文件,Maven Central的該字段默認(rèn)為False,這是為了防止大量Nexus無意識的去消耗中央倉庫的帶寬(中央倉庫有大量的構(gòu)件,其索引文件也很大)。這里我 們需要將其設(shè)置為True,然后點(diǎn)擊Save。在Nexus下載的中央倉庫索引文件之后,我們就可以在本地搜索中央倉庫的所有構(gòu)件。下圖展示了我們剛才所 涉及的配置:
?
添加一個(gè)代理倉庫
這里我們再舉一個(gè)例子,我們想要代理Sonatype的公共倉庫,其地址為:http://repository.sonatype.org /content/groups/public/。步驟如下,在Repositories面板的上方,點(diǎn)擊Add,然后選擇Proxy Repository,在下方的配置部分,我們填寫如下的信息:Repository ID - sonatype;Repository Name - Sonatype Repository;Remote Storage Location - http://repository.sonatype.org/content/groups/public/。其余的保持默認(rèn)值,需要注意的是 Repository Policy,我們不想代理snapshot構(gòu)件,原因前面已經(jīng)描述。然后點(diǎn)擊Save。配置頁面如下:
?
管理本地Maven倉庫
Nexus預(yù)定義了3個(gè)本地倉庫,分別為Releases,Snapshots,和3rd Party。這三個(gè)倉庫都有各自明確的目的。Releases用于部署我們自己的release構(gòu)件,Snapshots用于部署我們自己的 snapshot構(gòu)件,而3rd Party用于部署第三方構(gòu)件,有些構(gòu)件如Oracle的JDBC驅(qū)動(dòng),我們不能從公共倉庫下載到,我們就需要將其部署到自己的倉庫中。
當(dāng)然你也可以創(chuàng)建自己的本地倉庫,步驟和創(chuàng)建代理倉庫類似,點(diǎn)擊Repository面板上方的Add按鈕,然后選擇Hosted Repository,然后在下方的配置面板中輸入id和name,注意這里我們不再需要填寫遠(yuǎn)程倉庫地址,Repository Type則為不可修改的hosted,而關(guān)于Repository Policy,你可以根據(jù)自己的需要選擇Release或者Snapshot,如圖:
?
管理Maven倉庫組
Nexus中倉庫組的概念是Maven沒有的,在Maven看來,不管你是hosted也好,proxy也好,或者group也好,對我都是一樣 的,我只管根據(jù)groupId,artifactId,version等信息向你要構(gòu)件。為了方便Maven的配置,Nexus能夠?qū)⒍鄠€(gè)倉 庫,hosted或者proxy合并成一個(gè)group,這樣,Maven只需要依賴于一個(gè)group,便能使用所有該group包含的倉庫的內(nèi)容。
Nexus預(yù)定義了“Public Repositories”和“Public Snapshot Repositories”兩個(gè)倉庫組,前者默認(rèn)合并所有預(yù)定義的Release倉庫,后者默認(rèn)合并所有預(yù)定義的Snapshot倉庫。我們在本文前面的 部分創(chuàng)建了一個(gè)名為“Sonatype Repository”的倉庫,現(xiàn)在將其合并到“Public Repositories”中。
點(diǎn)擊倉庫列表中的“Public Repositories”,然后選擇下方的"Configuration" Tab,在配置面板中,將右邊“Avaiable Repositories”中的“Sonatype Repository”拖拽到左邊的“Ordered Group Repository”中,如圖:
創(chuàng)建倉庫組和創(chuàng)建proxy及hosted倉庫類似,這里不再贅述。需要注意的是format字段需要填寫“maven2”,添加你感興趣的倉庫即可。
?
搜索構(gòu)件
在浩大的Maven倉庫中一下下點(diǎn)擊鏈接,瀏覽路徑以尋找感興趣的構(gòu)件是一件很郁悶的事情。Nexus基于nexus-indexer提供構(gòu)件搜索 功能,要想對倉庫進(jìn)行搜索,無論是hosted,proxy,或者group,你都必須確認(rèn)索引文件存在。這一點(diǎn)對于代理倉庫尤其重要,有些遠(yuǎn)程倉庫可能 根本就沒有索引,所以你無法搜索這些代理倉庫。有些遠(yuǎn)程倉庫的遠(yuǎn)程索引非常大,如中央倉庫達(dá)到了70M左右,那么第一次下載索引需要花很多時(shí)間,所以要期 望得到搜索結(jié)果,確保看到如下的文件:
一旦你的Nexus擁有了本地或者遠(yuǎn)程倉庫的索引文件,你就可以享受Nexus的構(gòu)件搜索功能了。不論登陸與否,你都可以使用關(guān)鍵字進(jìn)行模糊搜索, 比如我在左邊導(dǎo)航欄上部的搜索框內(nèi)輸入junit,然后點(diǎn)擊搜索按鈕,右邊立刻會分頁顯示500多條的junit相關(guān)構(gòu)件信息。如果你了解更多的信息,你 也可以通過限定groupId,artifactId,version進(jìn)行搜索,點(diǎn)擊導(dǎo)航欄中的“Advanced Search”,點(diǎn)擊右邊所有頁面左上角的下拉框,選擇“GAV Search”。筆者這里輸入junit:junit:4.4,然后回車:
選擇一項(xiàng)搜索結(jié)果,在頁面下方會顯示“Artifact Information”的面板,你可以點(diǎn)擊"artifact"或者"pom"下載對應(yīng)文件,而該面板右邊更顯示了一個(gè)Maven依賴配置,你可以直接復(fù)制該配置到Maven POM中,這是個(gè)十分方便的特性。
此外,值得一提的是,Nexus還支持基于classname的搜索,你只需點(diǎn)擊搜索頁面右上角的下拉框,選擇“Classname Search”,然后輸入類名即可,這里我不再贅述。
?
配置Maven使用Nexus
默認(rèn)情況下,Maven依賴于中央倉庫,這是為了能讓Maven開箱即用,但僅僅這么做明顯是錯(cuò)誤的,這會造成大量的時(shí)間及帶寬的浪費(fèi)。既然文章的前面已經(jīng)介紹了如何安裝和配置Nexus,現(xiàn)在我們就要配置Maven來使用本地的Nexus,以節(jié)省時(shí)間和帶寬資源。
我們可以將Repository配置到POM中,但一般來說這不是很好的做法,原因很簡單,你需要為所有的Maven項(xiàng)目重復(fù)該配置。因此,這里我將Repository的配置放到$user_home/.m2/settings.xml中:
- < settings > ??
- ...??
- < profiles > ??
- ??<profile>??
- ????<id>dev</id>??
- ????<repositories>??
- ??????<repository>??
- ????????<id>local-nexus</id>??
- ????????<url>http://127.0.0.1:8080/nexus/content/groups/public/</url>??
- ????????<releases>??
- ??????????<enabled>true</enabled>??
- ????????</releases>??
- ????????<snapshots>??
- ??????????<enabled>true</enabled>??
- ????????</snapshots>??
- ??????</repository>??
- ????</repositories>??
- ??</profile>??
- </ profiles ??
- < activeProfiles > ??
- ??<activeProfile>dev</activeProfile>??
- </ activeProfiles > ??
- ...??
- </ settings > ??
由于我們不能直接在settings.xml中插入<repositories>元素,這里我們編寫了一個(gè)profile,并添加了一 個(gè)profile并使用<activeProfile>元素自動(dòng)將這個(gè)profile激活。這里的local-nexus倉庫指向了剛才我們 配置的Nexus中“Public Repositories”倉庫組,也就是說,所有該倉庫組包含的倉庫都能供我們使用。此外,我們通過<releases> 和<snapshots>元素激活了Maven對于倉庫所有類型構(gòu)件下載的支持,當(dāng)然你也可以調(diào)節(jié)該配置,比如說禁止Maven從Nexus 下載snapshot構(gòu)件。
使用該配置,Maven就會從你的Nexus服務(wù)器下載構(gòu)件了,速度和從Central下載可不是一個(gè)數(shù)量級的。
?
部署構(gòu)件至Nexus
Nexus提供了兩種方式來部署構(gòu)件,你可以從UI直接上傳,也可以配置Maven部署構(gòu)件。
?
通過Nexus UI部署
有時(shí)候有個(gè)jar文件你無法從公共Maven倉庫找到,但是你能從其它得到這個(gè)jar文件(甚至是POM),那么你完全可以將這個(gè)文件部署到Nexus中,使其成為標(biāo)準(zhǔn)流程的一部分。步驟如下:
點(diǎn)擊左邊導(dǎo)航欄的"Repository",在右邊的倉庫列表中選擇一個(gè)倉庫,如“3rd Party”,然后會看到頁面下方有四個(gè)tab,選擇最后一個(gè)“Upload”,你會看到構(gòu)件上傳界面。選擇你要上傳的構(gòu)件,并指定POM,(或者手工編 寫GAV等信息),最后點(diǎn)擊Upload,該構(gòu)件就直接被部署到了Nexus的"3rd Party"倉庫中。如圖:
通過Maven部署
更常見的用例是:團(tuán)隊(duì)在開發(fā)一個(gè)項(xiàng)目的各個(gè)模塊,為了讓自己開發(fā)的模塊能夠快速讓其他人使用,你會想要將snapshot版本的構(gòu)件部署到Maven倉庫中,其他人只需要在POM添加一個(gè)對于你開發(fā)模塊的依賴,就能隨時(shí)拿到最新的snapshot。
以下的pom.xml配置和settings.xml能讓你通過Maven自動(dòng)化部署構(gòu)件:
pom.xml
- < project > ??
- ...??
- < distributionManagement > ??
- ??<repository>??
- ????<id>nexus-releases</id>??
- ??????<name>Nexus?Release?Repository</name>??
- ??????<url>http://127.0.0.1:8080/nexus/content/repositories/releases/</url>??
- ??</repository>??
- ??snapshotRepository>??
- ????<id>nexus-snapshots</id>??
- ????<name>Nexus?Snapshot?Repository</name>??
- ????<url>http://127.0.0.1:8080/nexus/content/repositories/snapshots/</url>??
- ??</snapshotRepository>??
- </ distributionManagement > ??
- ...??
- </ project > ??
settings.xml
- < settings > ??
- ...??
- < servers > ??
- ??<server>??
- ????<id>nexus-releases</id>??
- ????<username>admin</username>??
- ????<password>admin123</password>??
- ??</server>??
- ??<server>??
- ????<id>nexus-snapshots</>??
- ????<username>admin</username>??
- ????<password>admin123</password>??
- ??</server>????
- </ servers > ??
- ...??
- </ settings > ??
這里我們配置所有的snapshot版本構(gòu)件部署到Nexus的Snapshots倉庫中, 所有的release構(gòu)件部署到Nexus的Releases倉庫中。由于部署需要登陸,因?yàn)槲覀冊趕ettings.xml中配置對應(yīng) Repository id的用戶名和密碼。
然后,在項(xiàng)目目錄中執(zhí)行mvn deploy ,你會看到maven將項(xiàng)目構(gòu)件部署到Nexus中,瀏覽Nexus對應(yīng)的倉庫,就可以看到剛才部署的構(gòu)件。當(dāng)其他人構(gòu)建其項(xiàng)目時(shí),Maven就會從Nexus尋找依賴并下載。
?
總結(jié)
本文介紹強(qiáng)大的倉庫管理器——Nexus,包括如何下載安裝Nexus,配置Nexus代理中央倉庫,管理Nexus的代理倉庫,本地倉庫,以及倉 庫組。并幫助你了解如何通過Nexus搜索構(gòu)件。最后,如何在Maven中配置Nexus倉庫,以及如何部署構(gòu)件到Nexus倉庫中。這些都是Nexus 中最基本也是最常用的功能。隨著使用的深入,你會發(fā)現(xiàn)Nexus還有很多其它的特性,如用戶管理,角色權(quán)限管理等等。
Nexus的OSS版本是完全開源的,如果你有興趣,你可以學(xué)習(xí)其源碼,甚至自己實(shí)現(xiàn)一個(gè)REST客戶端。
馬上擁抱Nexus吧,它是免費(fèi)的!