一、了解Maven,Maven用來干什么呢
1. 優秀的構建工具
通過簡單的命令,能夠完成清理、編譯、測試、打包、部署等一系列過程。同時,不得不提的是,Maven是跨平台的,無論是在Windows、還是在Linux或Mac上,都可以使用同樣的命令。
2. 依賴管理工具
項目依賴的第三方的開源類庫,都可以通過依賴的方式引入到項目中來。代替了原來需要首先下載第三方jar,再加入到項目中的方式。從而更好的解決了合作開發中依賴增多、版本不一致、版本沖突、依賴臃腫等問題。
具體是怎么實現的呢?Maven通過坐標系統准確的定位每一個構件,即通過坐標找到對應的Java類庫。
3. 項目信息管理工具
能夠管理項目描述、開發者列表、版本控制系統地址、許可證等一些比較零散的項目信息。除了直接的項目信息,通過Maven自動生成的站點,以及一些已有的插件,還能夠輕松獲得項目文檔、測試報告、靜態分析報告、源碼版本、日志報告等非常具有價值的項目信息。
二、 Maven與Nexus
這個問題從Maven的第二個用處說起,依賴管理,通過在Pom中指定坐標的形式將jar引入到項目中。那這個過程,要經歷怎樣一個流程呢?從哪里尋找jar?下載的jar放到哪里?
將這個問題順下來,就知道nexus和maven的關系了。
從哪里找到jar?項目用到的jar又存放在哪里?這引出了倉庫的概念,maven通過倉庫來統一管理各種構件。Maven的倉庫分為本地倉庫和遠程倉庫。

當Maven根據坐標尋找構件時,它首先會查看本地倉庫,如果本地倉庫存在此構件,則直接使用;如果本地倉庫不存在此構件,或者需要查看是否有更新的構件版本,Maven會去遠程倉庫查找,發現需要的構件之后,下載到本地倉庫再使用。

到了這里,問題的答案也就出來了。
首先,Nexus是一種遠程倉庫,根據上段的介紹,我們已經知道遠程倉庫的作用。在遠程倉庫中,默認的是中央倉庫,中央倉庫是Maven核心自帶的遠程倉庫。那就使用中央倉庫不就得了嗎,為什么我們要安裝Nexus呢?
我們從項目實際開發來看:
1.一些無法從外部倉庫下載的構件,例如內部的項目還能部署到私服上,以便供其他依賴項目使用。
2. 為了節省帶寬和時間,在局域網內架設一個私有的倉庫服務器,用其代理所有外部的遠程倉庫。當本地Maven項目需要下載構件時,先去私服請求,如果私服沒有,則再去遠程倉庫請求,從遠程倉庫下載構件后,把構件緩存在私服上。這樣,及時暫時沒有Internet鏈接,由於私服已經緩存了大量構件,整個項目還是可以正常使用的。同時,也降低了中央倉庫的負荷。

Nexus僅僅是私服的一種。
maven的倉庫只有兩大類:1.本地倉庫 2.遠程倉庫,在遠程倉庫中又分成了3種:2.1 中央倉庫 2.2 私服 2.3 其它公共庫。
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上之后,再為Maven的下載請求提供服務。我們還可以把一些無法從外部倉庫下載到的構件上傳到私服上。
Maven私服的 個特性:
1.節省自己的外網帶寬:減少重復請求造成的外網帶寬消耗
2.加速Maven構件:如果項目配置了很多外部遠程倉庫的時候,構建速度就會大大降低
3.部署第三方構件:有些構件無法從外部倉庫獲得的時候,我們可以把這些構件部署到內部倉庫(私服)中,供內部maven項目使用
4.提高穩定性,增強控制:Internet不穩定的時候,maven構建也會變的不穩定,一些私服軟件還提供了其他的功能
5.降低中央倉庫的負荷:maven中央倉庫被請求的數量是巨大的,配置私服也可以大大降低中央倉庫的壓力
因此我們在實際的項目中通常使用私服來間接訪問中央倉庫,項目通常不直接訪問中央倉庫
在私服中我們一nexus為主,下載地址是http://www.sonatype.org/nexus/go,下載之后解壓縮,將nexus-2.11.1-01-bundle\nexus-2.11.1-01\bin的路徑加入到我們的環境變量中去,通過cmd命令打開docs窗口,輸入nexus命令,顯示如下:Usage: nexus { console : start : stop : restart : install : uninstall }
請按任意鍵繼續. . . 則表示配置成功,在我們使用之前首先需要通過nexus install命令安裝私服,然后通過nexus start啟動私服,nexus私服有自己內置的服務器,默認的訪問端口號是8081,我們可以通過http://localhost:8081/nexus/地址訪問私服,點擊右上角的log in輸入admin/admin123登陸私服,點擊Views/Repositories下的Repositories進入如下頁面:

我們看到倉庫的類型主要有proxy、hosted、group類型,其中proxy是代理的遠程倉庫,hosted是指本地或者內部項目倉庫,group只是一個倉庫組,它包含其他的幾個倉庫,Releases是指發行版本(本地或者內部項目),Snapshots是指正在構建的版本(本地或者內部項目),Central是指中央倉庫(遠程中央倉庫下載的構件放入此處)。
我們可以再項目的pom.xml文件中配置:
<repositories>
<repository>
<id>nexus</id>
<name>nexus-repo</name>
<url>http://localhost:8081/nexus/content/repositories/central/</url>
</repository>
</repositories>
這樣我們的項目就可以從私服的中央倉庫中下載構件,但是如果我們需要用到releases或者snapshots倉庫,就需要增加額外的配置,此時就需要用到我們的group倉庫,我們先查看一下group倉庫

group倉庫默認包含四個倉庫,因此我們只需要配置group倉庫就可以將其他幾個倉庫都配置上去
<repositories>
<repository>
<id>nexus</id>
<name>nexus-repo</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
在項目的pom.xml文件配置,只能對當前的項目起作用,因此它是一個局部的配置,我們可以再maven的settings.xml 中配置,那么它就起到一個全局的作用,在profiles節點下配置:
<profile>
<id>nexusProfile</id>
<repositories>
<repository>
<id>nexus</id>
<name>nexus-repo</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
</profile>
此時的profile並未激活,我們還需要配置:
<activeProfiles>
<activeProfile>nexusProfile</activeProfile> //其值指向profile的id
</activeProfiles>
在我們的配置文件中可能有很多個profile,每一個profile只有激活之后才生效。
這個時候當我們在我們的項目中加入依賴,項目通過我們的私服去訪問遠程中央倉庫,將下載到的構件放入到我們的私服中,但是當我們通過nexus stop 命令關閉私服時,我們再次在項目中加入依賴我們會發現,項目會先訪問私服,但是發現私服關閉了,就會從遠程中央倉庫去下載我們需要的構件,這樣的情況並不是我們想要的 ,因為我們希望通過私服去間接的訪問遠程中央倉庫,那么這個時候的解決辦法就是配置鏡像,每一個倉庫都有一個唯一的id,遠程中央倉庫的id是central,上面配置的倉庫的id為nexus,當我們的項目要訪問central或nexus倉庫時,我們讓它鏡像到其他的倉庫上,不管你訪問哪一個倉庫,但是只能訪問指定的鏡像倉庫,我們可以再settings.xml中的mirrors節點下配置:
<mirror>
<id>nexusId</id>
<mirrorOf>central,nexus</mirrorOf> //在這里我們通常使用*代替central,nexus,表示任何的訪問都會鏡像到這里
<name>Human Readable Name for this Mirror.</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
那么這樣就實現了,只能通過私服去訪問遠程中央倉庫。
