Nexus介紹

 

Nexus介紹

Nexus 是Maven倉庫管理器,如果你使用Maven,你可以從Maven中央倉庫 下載所需要的構件(artifact),但這通常不是一個好的做法,你應該在本地架設一個Maven倉庫服務器,在代理遠程倉庫的同時維護本地倉庫,以節省帶寬和時間,Nexus就可以滿足這樣的需要。此外,他還提供了強大的倉庫管理功能,構件搜索功能,它基於REST,友好的UI是一個extjs的REST客戶端,它佔用較少的內存,基於簡單文件系統而非數據庫。這些優點使其日趨成爲最流行的Maven倉庫管理器。

 

下載和安裝

你可以從http://nexus.sonatype.org/downloads/ 下載最新版本的Nexus,筆者使用的是1.3.0版本。

Nexus提供了兩種安裝方式,一種是內嵌Jetty的bundle,只要你有JRE就能直接運行。第二種方式是WAR,你只須簡單的將其發佈到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 ,運行Nexus.bat 。你會看到Nexus的啓動日誌,當你看到“Started [email protected]:8081”之後,說明Nexus啓動成功了,然後打開瀏覽器,訪問http://127.0.0.1:8081/nexus,你會看到如下的頁面:

要停止Nexus,Ctrl+C即可,此外InstallNexus.bat可以用來將Nexus安裝成一個windows服務,其餘的腳本則對應了啓動,停止,暫停,恢復,卸載Nexus服務。

 

WAR方式安裝

你需要有一個能運行的web容器,這裏以Tomcat爲例,加入Tomcat的安裝目錄位於D:\dev_tools\apache-tomcat-6.0.18 ,首先我們將下載的nexus-webapp-1.3.0.war 重命名爲nexus.war ,然後複製到D:\dev_tools\apache-tomcat-6.0.18\webapps\nexus.war ,然後啓動CMD,cd到D:\dev_tools\apache-tomcat-6.0.18\bin\ 目錄,運行startup.bat 。一切OK,現在可以打開瀏覽器訪問http://127.0.0.1:8080/nexus,你會得到和上圖一樣的界面。

 

代理外部Maven倉庫

登陸

要管理Nexus,你首先需要以管理員身份登陸,點擊界面右上角的login,輸入默認的登錄名和密碼:admin/admin123,登陸成功後,你會看到左邊的導航欄增加了很多內容:

這裏,可以管理倉庫,配置Nexus系統,管理任務,管理用戶,角色,權限,查看系統的RSS源,管理及查看系統日誌,等等。你會看到Nexus的功能十分豐富和強大,本文,筆者只介紹一些最基本的管理和操作。

 

代理Maven中央倉庫

點擊左邊導航欄的Repositories,界面的主面板會顯示所有一個所有倉庫及倉庫組的列表,你會看到它們的Type字段的值有group,hosted,proxy,virtual。這裏我們不關心virtual,只介紹下另外三種類型:

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

由此我們知道,我們需要配置一個Maven中央倉庫的proxy,其實Nexus已經內置了Maven Central,但我們需要做一些配置。點擊倉庫列表中的Maven Central,你會注意到它的Policy是release,這說明它不會代理遠程倉庫的snapshot構件,這是有原因的,遠程倉庫的snapshot版本構件不穩定且不受你控制,使用這樣的構件含有潛在的風險。然後我們發現主面板下方有三個Tab,分別爲Browse,Configuration和Mirrors,我們點擊Configuration進行配置,你現在需要關心的是兩個配置項:“Remote Storage Location”爲遠程倉庫的地址,對於Maven Central來說是http://repo1.maven.org/maven2/;“Download Remote Indexes”顧名思義是指是否下載遠程索引文件,Maven Central的該字段默認爲False,這是爲了防止大量Nexus無意識的去消耗中央倉庫的帶寬(中央倉庫有大量的構件,其索引文件也很大)。這裏我們需要將其設置爲True,然後點擊Save。在Nexus下載的中央倉庫索引文件之後,我們就可以在本地搜索中央倉庫的所有構件。下圖展示了我們剛纔所涉及的配置:

 

添加一個代理倉庫

這裏我們再舉一個例子,我們想要代理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/。其餘的保持默認值,需要注意的是Repository Policy,我們不想代理snapshot構件,原因前面已經描述。然後點擊Save。配置頁面如下:

 

管理本地Maven倉庫

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

當然你也可以創建自己的本地倉庫,步驟和創建代理倉庫類似,點擊Repository面板上方的Add按鈕,然後選擇Hosted Repository,然後在下方的配置面板中輸入id和name,注意這裏我們不再需要填寫遠程倉庫地址,Repository Type則爲不可修改的hosted,而關於Repository Policy,你可以根據自己的需要選擇Release或者Snapshot,如圖:

 

管理Maven倉庫組

Nexus中倉庫組的概念是Maven沒有的,在Maven看來,不管你是hosted也好,proxy也好,或者group也好,對我都是一樣的,我只管根據groupId,artifactId,version等信息向你要構件。爲了方便Maven的配置,Nexus能夠將多個倉庫,hosted或者proxy合併成一個group,這樣,Maven只需要依賴於一個group,便能使用所有該group包含的倉庫的內容。

Nexus預定義了“Public Repositories”和“Public Snapshot Repositories”兩個倉庫組,前者默認合併所有預定義的Release倉庫,後者默認合併所有預定義的Snapshot倉庫。我們在本文前面的部分創建了一個名爲“Sonatype Repository”的倉庫,現在將其合併到“Public Repositories”中。

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

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

 

搜索構件

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

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

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

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

 

配置Maven使用Nexus

默認情況下,Maven依賴於中央倉庫,這是爲了能讓Maven開箱即用,但僅僅這麼做明顯是錯誤的,這會造成大量的時間及帶寬的浪費。既然文章的前面已經介紹瞭如何安裝和配置Nexus,現在我們就要配置Maven來使用本地的Nexus,以節省時間和帶寬資源。

我們可以將Repository配置到POM中,但一般來說這不是很好的做法,原因很簡單,你需要爲所有的Maven項目重複該配置。因此,這裏我將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對於倉庫所有類型構件下載的支持,當然你也可以調節該配置,比如說禁止Maven從Nexus下載snapshot構件。

使用該配置,Maven就會從你的Nexus服務器下載構件了,速度和從Central下載可不是一個數量級的。

 

部署構件至Nexus

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

 

通過Nexus UI部署

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

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

 

通過Maven部署

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

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

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版本構件部署到Nexus的Snapshots倉庫中, 所有的release構件部署到Nexus的Releases倉庫中。由於部署需要登陸,因爲我們在settings.xml中配置對應Repository id的用戶名和密碼。

然後,在項目目錄中執行mvn deploy ,你會看到maven將項目構件部署到Nexus中,瀏覽Nexus對應的倉庫,就可以看到剛纔部署的構件。當其他人構建其項目時,Maven就會從Nexus尋找依賴並下載。

 

總結

本文介紹強大的倉庫管理器——Nexus,包括如何下載安裝Nexus,配置Nexus代理中央倉庫,管理Nexus的代理倉庫,本地倉庫,以及倉庫組。並幫助你瞭解如何通過Nexus搜索構件。最後,如何在Maven中配置Nexus倉庫,以及如何部署構件到Nexus倉庫中。這些都是Nexus中最基本也是最常用的功能。隨着使用的深入,你會發現Nexus還有很多其它的特性,如用戶管理,角色權限管理等等。

Nexus的OSS版本是完全開源的,如果你有興趣,你可以學習其源碼,甚至自己實現一個REST客戶端。

馬上擁抱Nexus吧,它是免費的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章