前面的文章中我們了解到maven的倉庫一共有三種:
1.中央倉庫
2.私有倉庫
3.本地倉庫
一般情況下 是本地倉庫從中央倉庫直接下載下傳 依賴包,但是因為網速等問題影響常常出現下載下傳包失敗或者因為中央倉庫包的版本缺少下載下傳不到包的情況,這種時候,就展現到了nexus私有倉庫的好處。我們來了解一下nexus私有倉庫。
nexus介紹
nexus其實是一個倉庫管理器,可以幫助我們在本地架設一個 Maven倉庫伺服器。
說的通俗一點兒,就是在本地maven倉 庫和中央倉庫之間再建一個中間倉庫,本地倉庫如果需要下載下傳構件可以先去這個倉庫管理器擷取,如果倉庫管理器有了那麼直接就可以用,如果倉庫管理器沒有那麼 由它去中央倉庫擷取。通常,在一個公司内部,可以建立公司級的倉庫管理器,相當于一個公司隻有這個倉庫管理器去和中央倉庫打交道,而這個倉庫管理器通常設 置在公司内網,大大減輕了從中央倉庫擷取構件的帶寬和不必要的磁盤浪費。
nexus還提供了強大的倉庫管理功能,構件搜尋功能,它基于REST,友好的UI是一個extjs的REST用戶端,它占用較少的記憶體,基于簡單檔案系統而非資料庫。這些優點使其日趨成為最流行的Maven倉庫管理器。
nexus安裝
下載下傳
位址:http://www.sonatype.org/nexus/go

安裝
下載下傳完,解壓縮後可以看到兩個檔案夾,一個是nexus-2.11.0-02,另一個是sonatype-work,我們隻需要将nexus-2.11.0-02拷貝到需要安裝的路徑即可,比如在我的機器上,我建立了一個nexus檔案夾,把nexus-2.11.0-02拷貝了進去,sonatype-work可以不拷貝。
很簡單,這就安裝完了。
PS:
如果你是在linux下安裝,那麼就下載下傳nexus-webapp-1.3. 4 -bundle. tar .gz, 解壓後轉到${NEXUS_HOME}/ nexus-webapp-1.3.3/bin/jsw/linux-x86-32,它還支援solaris,macos等作業系統。
也可以通過war包運作形式安裝,war的方式以web應用的形式釋出到你的應用伺服器,比如tomcat。你所要做的就是下載下傳war版本的檔案,然後放到應用伺服器的釋出目錄即可
啟動
nexus已經将各個平台的啟動腳本都寫好了,并分開目錄放置,具體可以檢視nexus-2.11.0-02\bin\jsw目錄,我的機器是 windows64位的,就可以進入到windows-x86-64目錄下,點選console-nexus.bat即可啟動,啟動完成後,通路 url:http://localhost:8081/nexus即可看到nexus的頁面nexus2如果是其他平台,找到對應的目錄啟動腳本即可。
倉庫配置
通過浏覽器通路到nexus的管理界面:http://localhost:8081/nexus。管理者登陸密碼預設為:admin/admin123
輸入使用者名密碼登陸進去之後,看到如下界面:
左側分為4部分,其中views/repositories是倉庫相關的管理項;security是安全權限相關的;administrotr是管理相關的;help是幫助相關的。
倉庫浏覽
點選左側的“views/repositories–>repositories”,右邊列出來了nexus預設的倉庫nexus4其中有四種類型的倉庫,分别是hosted、proxy、virtual、group
hosted,本地倉庫,通常我們會部署自己的構件到這一類型的倉庫。比如公司的第二方庫。
proxy,代理倉庫,它們被用來代理遠端的公共倉庫,如maven中央倉庫。
group,倉庫組,用來合并多個hosted/proxy倉庫,當你的項目希望在多個repository使用資源時就不需要多次引用了,隻需要引用一個group即可。
hosted,宿主型的,實實在在由nexus給管理的倉庫,nexus自帶了3個宿主倉庫nexus5proxy,代理型的,每個倉庫都是對一個遠端倉庫的代理,這其中就包括了對中央倉庫的代理nexus6virtual,虛拟型的,這個不太了解,就不說了group, 嚴格來說它不是一個倉庫,顧名思義,是組的意思,它相當于是由多個倉庫合成了一個組,由該組的url對外提供服務,nexus預設有兩個組,一個是 public group,其中包含了上邊的3個宿主倉庫和中央倉庫;另一個是public snapshots group,裡邊包含了Apache Snapshots和CodeHaus Sanpshots。當然這些組包含的内容是可以修改的。
同時,nexus提供了增加、删除、修改倉庫定義的功能。
打開遠端倉庫索引下載下傳
上一篇文章咱們也提到了,巨大的使用者通路中央倉庫會帶來巨大的網絡壓力和伺服器壓力,是以在nexus中預設的各個代理倉庫的索引都是關閉狀态,即 安裝完nexus後裡邊是空的,什麼東東都沒有,包括索引。我們現在要做的就是需要把這個索引給下載下傳到nexus伺服器中,以便使用者可以從nexus中 搜尋到相關建構。
方法如下:
選中中央倉庫這條記錄,即名字為central的倉庫下邊選中configuration頁籤,找到其中的Download Remote Indexes,把fasle改為true,并儲存在上邊的中央倉庫記錄上點選右鍵,選擇update index
下載下傳完成後
然後在下邊選中Browse Index頁籤,打開central這顆樹的節點,應該能看到内容。在下載下傳索引之前是空的。
變成了
而且對構件進行搜尋 已經能搜尋到内容了
其他的proxy類型的倉庫,都可以用同樣的方法來下載下傳索引。注意:這一步僅僅是下載下傳了遠端倉庫的索引,真正的構件還沒有下載下傳到nexus中。等真正有實際使用者使用這些構件的時候,才會從中央倉庫下載下傳真實的構件檔案。
PS:有可能下載下傳不下來,這種情況是自帶的中央倉庫連結已經改版
通路一下這個連結,發現已經改版了,但是httpclient不能自動處理重定向
解決方案
nexus私服update index失敗解決方案
這裡有幾個項目是我們可能會經常用到的:
Override local storage location: 在這個選項你可以配置你的Nexus本地倉庫的存放位址,用來覆寫其預設的存放位址
Remote storage location: 這裡是遠端倉庫的位址,為了提高代理速度,你可以修改為國内的鏡像位址。預設值是http://repo1.maven.org/maven2/
Download remote indexes: 這裡配置是否下載下傳遠端索引檔案,模式是false, 建議配置為true,這樣我們便可以通過索引檔案來搜尋我們需要的構件
添加代理倉庫
通常情況下,使用預設的代理倉庫已經能夠滿足大部分項目的需求了, 隻有在特殊需求的情況下才會參加代理倉庫.
Maven central是一個比較大的代理倉庫,如果你需要添加的一個代理倉庫,那麼可以在點選左邊慘淡欄裡面的Repositories,然後右邊的頁面點選add -> add proxy repository, 之後出現以下頁面:
填寫相關資訊儲存即可。
管理本地倉庫
我們前面講到類型為hosted的為本地倉庫,Nexus預定義了3個本地倉庫,分别是Releases, Snapshots, 3rd Party. 分别講一下這三個預置的倉庫都是做什麼用的:
Releases: 這裡存放我們自己項目中釋出的建構, 通常是Release版本的, 比如我們自己做了一個FTP Server的項目, 生成的構件為ftpserver.war, 我們就可以把這個建構釋出到Nexus的Releases本地倉庫. 關于符合釋出後面會有介紹.
Snapshots: 這個倉庫非常的有用, 它的目的是讓我們可以釋出那些非release版本, 非穩定版本, 比如我們在trunk下開發一個項目,在正式release之前你可能需要臨時釋出一個版本給你的同伴使用, 因為你的同伴正在依賴你的子產品開發, 那麼這個時候我們就可以釋出Snapshot版本到這個倉庫, 你的同伴就可以通過簡單的指令來擷取和使用這個臨時版本.
3rd Party: 顧名思義, 第三方庫, 你可能會問不是有中央倉庫來管理第三方庫嘛, 沒錯, 這裡的是指可以讓你添加自己的第三方庫, 比如有些構件在中央倉庫是不存在的. 比如你在中央倉庫找不到Oracle 的JDBC驅動, 這個時候我們就需要自己添加到3rd party倉庫.
你也可以建立自己的本地倉庫,點選Repository面闆上方的Add按鈕,然後選擇Hosted Repository,然後在下方的配置面闆中輸入相關資訊, 這裡我們不再需要填寫遠端倉庫位址,根據自己的需要選擇Release或者Snapshot。
Maven 倉庫組
倉庫組的概念是Maven沒有的,通過前面介紹可以了解到, 我們可以建立多個proxy代理倉庫,hosted本地倉庫, 如果沒有倉庫組的概念,我們如果需要引用這些倉庫的是時候需要一一加入到我們的setting.xml裡面去, 有了倉庫的組的概念, 我們隻需要做一次引用就可以了,把我們需要的倉庫加入到倉庫組即可.像這樣:
<repositories>
<repository>
<id>nexus</id>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
這裡的url對應圖中的url
我們需要用哪一個就填哪一個的url
Nexus中預設了2個倉庫組,public repositories和public snapshot repositories. 如圖:
倉庫組預設包含本地倉庫Releases, snapshots, 3rd party和代理倉庫Maven Central. 你可以在Configuration配置頁添加倉庫到這個倉庫組. 如果需要你還可以建立一個倉庫組,如圖:
點選 Add->Repository Group
出現New Repository Group界面後,填入ID, name 等相關資訊, 在右邊Available Repositories 欄裡可以選擇你要添加的倉庫到你建立的倉庫組.
設定完之後我們就可以在maven項目中引用nexus私服了。
部署構件至Nexus
導入本地倉庫中的構件
經過上面的步驟,我們已經部署好了nexus的私服,如果我們之前本地項目下載下傳了一些常用的jar包(構件),就可以直接複制到 私服的倉庫目錄中,這樣就不用再去下載下傳一次了。
首先确認一下 nexus私服倉庫的路徑
找到本地倉庫
把repository檔案夾複制過來即可
通過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
<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</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
...
</settings>
這裡我們配置所有的snapshot版本構件部署到Nexus的Snapshots倉庫中, 所有的release構件部署到Nexus的Releases倉庫中。由于部署需要登陸,因為我們在settings.xml中配置對應Repository id的使用者名和密碼。
然後,在項目目錄中執行mvn deploy ,你會看到maven将項目構件部署到Nexus中,浏覽Nexus對應的倉庫,就可以看到剛才部署的構件。當其他人建構其項目時,Maven就會從Nexus尋找依賴并下載下傳。
配置Maven使用Nexus
經過上面的步驟,我們已經準備就緒了,現在就可以在maven中調用nexus私服了。
我們可以将Repository配置到POM中,但一般來說這不是很好的做法,原因很簡單,你需要為所有的Maven項目重複該配置。是以,這裡我将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中插入元素,這裡我們編寫了一個profile,并添加了一個profile并使用元素自動将這個profile激活。這裡的local-nexus倉庫指向了剛才我們配置的Nexus中“Public Repositories”倉庫組,也就是說,所有該倉庫組包含的倉庫都能供我們使用。此外,我們通過和元素激活了Maven對于倉庫所有類型構件下載下傳的支援,當然你也可以調節該配置,比如說禁止Maven從Nexus下載下傳snapshot構件。
使用該配置,Maven就會從你的Nexus伺服器下載下傳構件了,速度和從Central下載下傳可不是一個數量級的。
ps:現在也可以使用鏡像庫,其原理跟私有庫是一樣的,但是是别人搭建的公有庫。
隻需要在配置中mirrors裡面增加鏡像配置即可,例如:
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>osc</id>
<mirrorOf>*</mirrorOf>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
</mirrors>