Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          關(guān)鍵字: maven nexus

          Nexus介紹

          Nexus 是Maven倉庫管理器,如果你使用Maven,你可以從Maven中央倉庫 下載所需要的構(gòu)件(artifact),但這通常不是一個好的做法,你應(yīng)該在本地架設(shè)一個Maven倉庫服務(wù)器,在代理遠(yuǎn)程倉庫的同時維護(hù)本地倉庫,以節(jié) 省帶寬和時間,Nexus就可以滿足這樣的需要。此外,他還提供了強(qiáng)大的倉庫管理功能,構(gòu)件搜索功能,它基于REST,友好的UI是一個extjs的 REST客戶端,它占用較少的內(nèi)存,基于簡單文件系統(tǒng)而非數(shù)據(jù)庫。這些優(yōu)點使其日趨成為最流行的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)你看到“Started SelectChannelConnector@0.0.0.0:8081”之后,說明Nexus啟動成功了,然后打開瀏覽器,訪問 http://127.0.0.1:8081/nexus,你會看到如下的頁面:

          要停止Nexus,Ctrl+C即可,此外InstallNexus.bat可以用來將Nexus安裝成一個windows服務(wù),其余的腳本則對應(yīng)了啟動,停止,暫停,恢復(fù),卸載Nexus服務(wù)。

          ?

          WAR方式安裝

          你需要有一個能運(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 ,然后啟動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,你首先需要以管理員身份登陸,點擊界面右上角的login,輸入默認(rèn)的登錄名和密碼:admin/admin123,登陸成功后,你會看到左邊的導(dǎo)航欄增加了很多內(nèi)容:

          這里,可以管理倉庫,配置Nexus系統(tǒng),管理任務(wù),管理用戶,角色,權(quán)限,查看系統(tǒng)的RSS源,管理及查看系統(tǒng)日志,等等。你會看到Nexus的功能十分豐富和強(qiáng)大,本文,筆者只介紹一些最基本的管理和操作。

          ?

          代理Maven中央倉庫

          點擊左邊導(dǎo)航欄的Repositories,界面的主面板會顯示所有一個所有倉庫及倉庫組的列表,你會看到它們的Type字段的值有g(shù)roup,hosted,proxy,virtual。這里我們不關(guān)心virtual,只介紹下另外三種類型:

          • hosted,本地倉庫,通常我們會部署自己的構(gòu)件到這一類型的倉庫。
          • proxy,代理倉庫,它們被用來代理遠(yuǎn)程的公共倉庫,如maven中央倉庫。
          • group,倉庫組,用來合并多個hosted/proxy倉庫,通常我們配置maven依賴倉庫組。

          由此我們知道,我們需要配置一個Maven中央倉庫的proxy,其實Nexus已經(jīng)內(nèi)置了Maven Central,但我們需要做一些配置。點擊倉庫列表中的Maven Central,你會注意到它的Policy是release,這說明它不會代理遠(yuǎn)程倉庫的snapshot構(gòu)件,這是有原因的,遠(yuǎn)程倉庫的 snapshot版本構(gòu)件不穩(wěn)定且不受你控制,使用這樣的構(gòu)件含有潛在的風(fēng)險。然后我們發(fā)現(xiàn)主面板下方有三個Tab,分別為 Browse,Configuration和Mirrors,我們點擊Configuration進(jìn)行配置,你現(xiàn)在需要關(guān)心的是兩個配置 項:“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,然后點擊Save。在Nexus下載的中央倉庫索引文件之后,我們就可以在本地搜索中央倉庫的所有構(gòu)件。下圖展示了我們剛才所 涉及的配置:

          ?

          添加一個代理倉庫

          這里我們再舉一個例子,我們想要代理Sonatype的公共倉庫,其地址為:http://repository.sonatype.org /content/groups/public/。步驟如下,在Repositories面板的上方,點擊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)描述。然后點擊Save。配置頁面如下:

          ?

          管理本地Maven倉庫

          Nexus預(yù)定義了3個本地倉庫,分別為Releases,Snapshots,和3rd Party。這三個倉庫都有各自明確的目的。Releases用于部署我們自己的release構(gòu)件,Snapshots用于部署我們自己的 snapshot構(gòu)件,而3rd Party用于部署第三方構(gòu)件,有些構(gòu)件如Oracle的JDBC驅(qū)動,我們不能從公共倉庫下載到,我們就需要將其部署到自己的倉庫中。

          當(dāng)然你也可以創(chuàng)建自己的本地倉庫,步驟和創(chuàng)建代理倉庫類似,點擊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ū)⒍鄠€倉 庫,hosted或者proxy合并成一個group,這樣,Maven只需要依賴于一個group,便能使用所有該group包含的倉庫的內(nèi)容。

          Nexus預(yù)定義了“Public Repositories”和“Public Snapshot Repositories”兩個倉庫組,前者默認(rèn)合并所有預(yù)定義的Release倉庫,后者默認(rèn)合并所有預(yù)定義的Snapshot倉庫。我們在本文前面的 部分創(chuàng)建了一個名為“Sonatype Repository”的倉庫,現(xiàn)在將其合并到“Public Repositories”中。

          點擊倉庫列表中的“Public Repositories”,然后選擇下方的"Configuration" Tab,在配置面板中,將右邊“Avaiable Repositories”中的“Sonatype Repository”拖拽到左邊的“Ordered Group Repository”中,如圖:

          創(chuàng)建倉庫組和創(chuàng)建proxy及hosted倉庫類似,這里不再贅述。需要注意的是format字段需要填寫“maven2”,添加你感興趣的倉庫即可。

          ?

          搜索構(gòu)件

          在浩大的Maven倉庫中一下下點擊鏈接,瀏覽路徑以尋找感興趣的構(gòu)件是一件很郁悶的事情。Nexus基于nexus-indexer提供構(gòu)件搜索 功能,要想對倉庫進(jìn)行搜索,無論是hosted,proxy,或者group,你都必須確認(rèn)索引文件存在。這一點對于代理倉庫尤其重要,有些遠(yuǎn)程倉庫可能 根本就沒有索引,所以你無法搜索這些代理倉庫。有些遠(yuǎn)程倉庫的遠(yuǎn)程索引非常大,如中央倉庫達(dá)到了70M左右,那么第一次下載索引需要花很多時間,所以要期 望得到搜索結(jié)果,確保看到如下的文件:

          一旦你的Nexus擁有了本地或者遠(yuǎn)程倉庫的索引文件,你就可以享受Nexus的構(gòu)件搜索功能了。不論登陸與否,你都可以使用關(guān)鍵字進(jìn)行模糊搜索, 比如我在左邊導(dǎo)航欄上部的搜索框內(nèi)輸入junit,然后點擊搜索按鈕,右邊立刻會分頁顯示500多條的junit相關(guān)構(gòu)件信息。如果你了解更多的信息,你 也可以通過限定groupId,artifactId,version進(jìn)行搜索,點擊導(dǎo)航欄中的“Advanced Search”,點擊右邊所有頁面左上角的下拉框,選擇“GAV Search”。筆者這里輸入junit:junit:4.4,然后回車:

          選擇一項搜索結(jié)果,在頁面下方會顯示“Artifact Information”的面板,你可以點擊"artifact"或者"pom"下載對應(yīng)文件,而該面板右邊更顯示了一個Maven依賴配置,你可以直接復(fù)制該配置到Maven POM中,這是個十分方便的特性。

          此外,值得一提的是,Nexus還支持基于classname的搜索,你只需點擊搜索頁面右上角的下拉框,選擇“Classname Search”,然后輸入類名即可,這里我不再贅述。

          ?

          配置Maven使用Nexus

          默認(rèn)情況下,Maven依賴于中央倉庫,這是為了能讓Maven開箱即用,但僅僅這么做明顯是錯誤的,這會造成大量的時間及帶寬的浪費(fèi)。既然文章的前面已經(jīng)介紹了如何安裝和配置Nexus,現(xiàn)在我們就要配置Maven來使用本地的Nexus,以節(jié)省時間和帶寬資源。

          我們可以將Repository配置到POM中,但一般來說這不是很好的做法,原因很簡單,你需要為所有的Maven項目重復(fù)該配置。因此,這里我將Repository的配置放到$user_home/.m2/settings.xml中:

          Xml代碼
          1. < settings > ??
          2. ...??
          3. < profiles > ??
          4. ??<profile>??
          5. ????<id>dev</id>??
          6. ????<repositories>??
          7. ??????<repository>??
          8. ????????<id>local-nexus</id>??
          9. ????????<url>http://127.0.0.1:8080/nexus/content/groups/public/</url>??
          10. ????????<releases>??
          11. ??????????<enabled>true</enabled>??
          12. ????????</releases>??
          13. ????????<snapshots>??
          14. ??????????<enabled>true</enabled>??
          15. ????????</snapshots>??
          16. ??????</repository>??
          17. ????</repositories>??
          18. ??</profile>??
          19. </ profiles > ??
          20. < activeProfiles > ??
          21. ??<activeProfile>dev</activeProfile>??
          22. </ activeProfiles > ??
          23. ...??
          24. </ settings > ??

          由于我們不能直接在settings.xml中插入<repositories>元素,這里我們編寫了一個profile,并添加了一 個profile并使用<activeProfile>元素自動將這個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下載可不是一個數(shù)量級的。

          ?

          部署構(gòu)件至Nexus

          Nexus提供了兩種方式來部署構(gòu)件,你可以從UI直接上傳,也可以配置Maven部署構(gòu)件。

          ?

          通過Nexus UI部署

          有時候有個jar文件你無法從公共Maven倉庫找到,但是你能從其它得到這個jar文件(甚至是POM),那么你完全可以將這個文件部署到Nexus中,使其成為標(biāo)準(zhǔn)流程的一部分。步驟如下:

          點擊左邊導(dǎo)航欄的"Repository",在右邊的倉庫列表中選擇一個倉庫,如“3rd Party”,然后會看到頁面下方有四個tab,選擇最后一個“Upload”,你會看到構(gòu)件上傳界面。選擇你要上傳的構(gòu)件,并指定POM,(或者手工編 寫GAV等信息),最后點擊Upload,該構(gòu)件就直接被部署到了Nexus的"3rd Party"倉庫中。如圖:


          通過Maven部署

          更常見的用例是:團(tuán)隊在開發(fā)一個項目的各個模塊,為了讓自己開發(fā)的模塊能夠快速讓其他人使用,你會想要將snapshot版本的構(gòu)件部署到Maven倉庫中,其他人只需要在POM添加一個對于你開發(fā)模塊的依賴,就能隨時拿到最新的snapshot。

          以下的pom.xml配置和settings.xml能讓你通過Maven自動化部署構(gòu)件:

          pom.xml

          Xml代碼
          1. < project > ??
          2. ...??
          3. < distributionManagement > ??
          4. ??<repository>??
          5. ????<id>nexus-releases</id>??
          6. ??????<name>Nexus?Release?Repository</name>??
          7. ??????<url>http://127.0.0.1:8080/nexus/content/repositories/releases/</url>??
          8. ??</repository>??
          9. ??<snapshotRepository>??
          10. ????<id>nexus-snapshots</id>??
          11. ????<name>Nexus?Snapshot?Repository</name>??
          12. ????<url>http://127.0.0.1:8080/nexus/content/repositories/snapshots/</url>??
          13. ??</snapshotRepository>??
          14. </ distributionManagement > ??
          15. ...??
          16. </ project > ??

          settings.xml

          Xml代碼
          1. < settings > ??
          2. ...??
          3. < servers > ??
          4. ??<server>??
          5. ????<id>nexus-releases</id>??
          6. ????<username>admin</username>??
          7. ????<password>admin123</password>??
          8. ??</server>??
          9. ??<server>??
          10. ????<id>nexus-snapshots</id>??
          11. ????<username>admin</username>??
          12. ????<password>admin123</password>??
          13. ??</server>????
          14. </ servers > ??
          15. ...??
          16. </ settings > ??

          這里我們配置所有的snapshot版本構(gòu)件部署到Nexus的Snapshots倉庫中, 所有的release構(gòu)件部署到Nexus的Releases倉庫中。由于部署需要登陸,因為我們在settings.xml中配置對應(yīng) Repository id的用戶名和密碼。

          然后,在項目目錄中執(zhí)行mvn deploy ,你會看到maven將項目構(gòu)件部署到Nexus中,瀏覽Nexus對應(yīng)的倉庫,就可以看到剛才部署的構(gòu)件。當(dāng)其他人構(gòu)建其項目時,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í)其源碼,甚至自己實現(xiàn)一個REST客戶端。

          馬上擁抱Nexus吧,它是免費(fèi)的!

          posted on 2009-06-04 16:32 禮物 閱讀(676) 評論(0)  編輯  收藏 所屬分類: Maven2
          主站蜘蛛池模板: 永和县| 孟村| 元朗区| 仁化县| 鹤庆县| 小金县| 安溪县| 武穴市| 合阳县| 岳普湖县| 永定县| 金门县| 德化县| 林口县| 兴化市| 辽宁省| 云梦县| 德兴市| 兴隆县| 环江| 丹巴县| 东至县| 佳木斯市| 甘肃省| 麻江县| 东宁县| 祁连县| 连平县| 岢岚县| 保山市| 锡林郭勒盟| 昌都县| 逊克县| 隆林| 海城市| 阳信县| 丹江口市| 仁怀市| 安泽县| 彰武县| 绥芬河市|