創建私服的好處是?java
能夠下降中央倉庫負荷、節省外網帶寬、加速Maven構建、本身部署構件等,從而高效地使用Mavenweb
三種專門的Maven倉庫管理軟件是?數據庫
1、Apache基金會的Archiva緩存
2、JFrog的Artifactory安全
3、Sonatype的Nexus服務器
Archiva是開源的,Artifactory和Nexus的核心也是開源的網絡
Nexus也是當前最流行的Maven倉庫管理軟件app
Nexus的由來eclipse
2005年12月,Tamas Cservenak因爲受不了匈牙利電信ADSL的低速度,開始着手開發Proximity——一個很簡單的Web應用,它能夠代理並緩存Maven構件,當Maven須要下載構件的時候,就不須要反覆依賴於ADSLwebapp
到了2007年,Sonatype邀請Tamas參與建立一個更酷的Maven倉庫管理軟件,這就是後來的Nexus
Nexus分爲開源版和專業版
專業版...收費,除了開源版本的全部特性以外,主要包含一些企業安全控制、發佈流程控制等須要的特性,地址http://www.sonatype.com/products/nexus/community
開源版本基於GPLv3許可證,其特性足以知足大部分Maven用戶的須要
Nexus開源版本的特性
1、較小的內存佔用(最少僅爲28MB)
2、基於ExtJS的友好界面
3、基於Restlet的徹底REST API
4、支持代理倉庫、宿主倉庫和倉庫組
5、基於文件系統,不須要數據庫
6、支持倉庫索引和搜索
7、支持從界面上傳Maven構件
8、細粒度的安全控制
Nexus的兩種安裝包
1、一種是包含Jetty容器的Bundle包
2、另外一種是不包含Web容器的war包
下載Nexus
地址:http://nexus.sonatype.org/downloads/下載最新版本的Nexus
包含jetty容器的包,nexus-latest-bundle.zip、nexus-latest-bundle.tar.gz
不包含jetty容器的包,nexus-latest-webapp.war
使用Bundle方式安裝Nexus
Nexus的Bundle自帶Jetty容器,所以不須要額外的Web容器就能直接啓動Nexus
解壓該nexus-latest-bundle.zip,包含兩個目錄:
1、nexus-2.6.4-02,該目錄包含了Nexus運行所須要的文件,如啓動腳本、依賴jar包等
2、sonatype-work,該目錄包含Nexus生成的配置文件、日誌文件、倉庫文件等
上面兩個目錄的進一步說明
1、第一個目錄是運行Nexus所必須的
2、第二個目錄不是必須的,Nexus會在運行的時候動態建立該目錄,當用戶須要備份Nexus時,默認備份sonatype-work目錄,由於該目錄包含了用戶特定的內容
在Windows操做系統上啓動Nexus
1、將nexus加入環境變量
2、打開:E:\maven\nexus\nexus-2.6.4-02\bin\jsw\conf\wrapper.conf
修改:wrapper.java.command=D:\Java\jdk1.7.0_03\bin\java
3、在命令行執行nexus install安裝nexus服務
4、執行nexus start啓動nexus服務
5、訪問地址http://localhost:8081/nexus/
內置倉庫有四種類型:group(倉庫組)、hosted(宿主)、proxy(代理)和virtual(虛擬)
倉庫格式有兩種maven2和maven1
倉庫的Policy(策略),表示該倉庫爲發佈(Release)版本倉庫仍是快照(Snapshot)版本倉庫狀態和路徑等信息
注意:maven1格式的倉庫省略,因爲虛擬類型倉庫的做用其實是動態地將倉庫內容格式轉換,也省略
Nexus內置的倉庫介紹
1、Maven Central:該倉庫代理Maven中央倉庫,其策略爲Release,所以只會下載和緩存中央倉庫中的發佈版本構件
2、Releases:這是一個策略爲Release的宿主類型倉庫,用來部署組織內部的發佈版本構件
3、Snapshots:這是一個策略爲Snapshot的宿主類型倉庫,用來部署組織內部的快照版本構件
4、3rd party:這是一個策略爲Release的宿主類型倉庫,用來部署沒法從公共倉庫得到的第三方發佈版本構件
5、Apache Snapshots:這是一個策略爲Snapshot的代理倉庫,用來代理Apache Maven倉庫的快照版本構件
6、Codehaus Snapshots:這是一個策略爲Snapshot的代理倉庫,用來代理Codehaus Maven倉庫的快照版本構件
7、Google Code:這是一個策略爲Release的代理倉庫,用來代理Google Code Maven倉庫的發佈版本構件
8、java.net - Maven 2:這是一個策略爲Release的代理倉庫,用來代理java.net Maven倉庫的發佈版本構件
9、Public Repositories:該倉庫組將上述全部策略爲Release的倉庫聚合並經過一致的地址提供服務
10、Public Snapshot Repositories:該倉庫組將上述全部策略爲Snapshot的倉庫聚合並經過一致的地址提供服務
舉個簡單的例子解釋上面各類倉庫之間的關係
假設某公司創建了Maven項目X,公司內部創建了Nexus私服,爲全部Maven項目提供服務。項目X依賴於不少流行的開源類庫如JUnit等,這些構件都能從Maven中央倉庫得到,所以Maven Central代理倉庫會被用來代理中央倉庫的內容,並在私服上緩存下來,X還依賴某個Google Code的項目,其構件在中央倉庫中不存在,只存在於Google Code的倉庫中,所以上述列表中的Google Code代理倉庫會被用來代理並緩存這樣的構件。X還依賴於Oracle的JDBC驅動,因爲版權的因素,該類庫沒法從公共倉庫得到,所以公司管理員將其部署到3rd party宿主倉庫中,供X使用。X的快照版本構件成功後會被部署到Snapshots宿主倉庫中,供其餘項目使用。當X發佈正式版本的時候,其構件會被部署到Release宿主倉庫中。因爲X用到了上述列表中的不少倉庫,爲每一個倉庫聲明Maven配置又比較麻煩,所以能夠直接使用倉庫組Public Repositories 和Public Snapshot Repositproies,當X須要JUnit的時候,它直接從Public Repositories下載,Public Repositories會選擇Maven Central提供實際的內容
建立Nexus宿主倉庫
1、根據本身的須要填入倉庫的ID和名稱
2、Repository Type表示該倉庫的類型
3、Provide用來肯定該倉庫的格式,通常來講,選擇默認的Maven2 Repository
4、Default Local Storage Location表示該倉庫的默認存儲路徑
5、Override Local Storage Location能夠用來配置自定義的倉庫目錄位置
6、在Access Settings小組中,Deployment Policy用來配置該倉庫的部署策略,選項有隻讀(禁止部署)、關閉從新部署(同一構件只能部署一次)以及容許從新部署
7、Allow File Browsing表示是否容許瀏覽倉庫內容,通常選True
8、Include in Search表示是否對該倉庫進行索引並提供搜索
9、Publish URL用來控制是否經過URL提供服務,若是選False,當訪問該倉庫的地址時,會獲得HTTP 404 Not Found錯誤
10、Not Found Cache TTL 表示當一個文件沒有找到後,緩存這一不存在信息的時間,以默認值1440分鐘爲例,若是某文件不存在,那麼在以後的1440分鐘內,若是Nexus再次獲得該文件的請求,它將直接返回不存在信息,而不會查找文件系統。這麼作是爲了不重複的文件查找操做以提高性能
建立Nexus代理倉庫
1、Repository Type的值爲proxy
2、Remote Storage Location遠程倉庫地址
3、Download Remote Indexes表示是否下載遠程倉庫的索引,有些遠程倉庫擁有索引,下載其索引後,即便沒有緩存遠程倉庫的構件用戶仍是可以在本地搜索和瀏覽哪些構件的基本信息
4、CheckSum Policy配置校驗和出錯的策略,用戶能夠選擇忽略、記錄警告信息或者拒絕下載,當遠程倉庫須要認證的時候,這裏的Authentication配置就能派上用場
5、Expiration Settings的Artifact Max Age和Metadata Max Age,其中前者表示構件緩存的最長時間,後者表示倉庫元數據文件緩存的最長時間
6、Artifact Max Age默認值爲-1,表示構件緩存後就一直保存着,再也不從新下載
7、Metadata Max Age默認值爲1440分鐘,表示每隔一天從新緩存代理的構件
8、Http Request Settings 配置Nexus訪問遠程倉庫時HTTP請求的參數
建立Nexus倉庫組
倉庫組所包含的倉庫的順序決定了倉庫組遍歷其所含倉庫的次序,所以最好將經常使用的倉庫放在前面,當用戶從倉庫組下載構件的時候,就可以儘快地訪問到包含構件的倉庫
一個簡單的需求,搜索
Maven中央倉庫有幾十萬構件供用戶使用,但有時咱們每每僅僅指導某個關鍵字,如Ehcache,而不知道其確切的Maven座標。Nexus經過維護倉庫的索引來提供搜索功能,能在很大程度上方便Maven用戶定位構件所標
搜索Maven中央庫
1、首先須要設置Nexus中的Maven Central代理倉庫下載遠程索引,將Download Remote Indexes設置成true默認是false
2、在左邊導航欄中的Scheduled Tasks,點擊能夠看到系統調度任務,若是狀態爲RUNNING表示正在下載
3、Nexus界面左邊導航欄有一個快捷搜索,在其中輸入關鍵字後,單擊搜索按鈕就能快速獲得搜索結果
關於中央倉庫的索引的說明
1、有了中央倉庫的索引,用戶不只可以搜索構件,還可以直接瀏覽中央倉庫的內容,這即是Nexus的索引瀏覽功能
2、在Repositories頁面中,選擇Browse Index選項卡,就能看到中央倉庫內容的樹形結構
3、搜索及瀏覽功能都是基於Nexus索引而實現的,確切地應該稱之爲nexus-indexer。
4、Nexus可以遍歷一個Maven倉庫全部的內容,蒐集它們的座標、校驗和及所含的Java類信息,而後以nexus-indexer的形式保存起來。
5、中央倉庫維護了這樣的一個nexus-indexer,所以本地地Nexus下載到這個索引以後,就能在此基礎上提供搜索和瀏覽等服務。
6、須要注意的是,不是任何一個公共倉庫都提供nexus-indexer,對於那些不提供索引的倉庫來講,咱們就沒法對其進行搜索
在POM中配置Nexus倉庫
<project>
...
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositores>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositores>
...
</project>
這樣的配置只對當前的Maven項目有效,在好實際的應用中,咱們每每想要經過一次配置就能讓本機全部的Maven項目都使用本身的Maven私服,這個時候就應該在settings.xml文件中進行配置
可是settings.xml並不支持直接配置repositories和pluginRepositories,所幸Maven還提供了Profile機制,能讓用戶將倉庫配置放到settings.xml中的Profile
在settings.xml中配置Nexus倉庫
<settings>
...
<profiles>
<profile>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositores>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enable>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositores>
</profile>
</profiles>
<activeprofiles>
<activeProfile>nexus</activeProfile>
</activeprofiles>
...
</settings>
對上述配置進行說明
1、該配置中使用了一個id爲nexus的profile,這個profile包含了相關的倉庫配置,同時配置中又使用activeProfile元素將nexus這個profile激活,這樣當執行Maven構建的時候,激活的profile會將倉庫配置應用到項目中
2、可是這樣配置,Maven除了從Nexus下載構件以外,還會不時地訪問中央倉庫central,咱們但願得是全部Maven下載請求都僅僅經過Nexus,以全面發揮私服的做用,這就須要藉助鏡像了
配置鏡像讓Maven只使用私服
<settings>
...
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors
...
</settings>
1、若是配置了鏡像,全部的倉庫配置都會失效
2、配置倉庫及插件倉庫的主要目的是開啓對快照版本下載的支持
3、當Maven須要下載發佈版或快照版構件的時候,它首先檢查central,看該類型的構件是否支持,獲得正面的回答以後,再根據鏡像配置規則轉而訪問私服倉庫地址
使用Maven部署構件至Nexus
平常開發生成的快照版本構件能夠直接部署到Nexus中策略爲Snapshot的宿主倉庫中,項目正式發佈的構件則應該部署到Nexus中策略爲Release的宿主倉庫中
配置Maven部署構件至Nexus
<project>
...
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Releases Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshots Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>
Nexus的倉庫對於匿名用戶是隻讀的,爲了可以部署構件,還須要在settings.xml中配置認證信息
爲部署構件至Nexus配置認證信息
<settings>
...
<servers>
<server>
<id>nexus-release</id>
<username>admin</username>
<password>*****</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>*****</password>
</server>
</servers>
...
</settings>
手動部署第三方構件至Nexus
1、某些Java Jar文件 (如Oracle)的JDBC驅動,因爲許可證的因素,它們沒法公開地放在公共倉庫中,此外還有大量得小型開源項目,它們沒有把本身的構件分發到中央倉庫,也沒有維護本身的倉庫,所以也沒法從公共倉庫得到
2、這個時候用戶就須要將這類構件手動下載到本地,而後經過Nexus的界面上傳到私服
3、通常選擇宿主倉庫如3rd party,而後再頁面的下方選擇Artifact Upload選項卡。在上傳構件的時候,Nexus要求用戶肯定其Maven座標,若是該構件是經過Maven構件的,那麼能夠在GAV Definition下拉列表中選擇From POM,不然就選GAV Parameters
4、定義好座標以後,單機Select Artifact(s) to Upload按鈕從本機選擇要上傳的構件,而後單機Add Artifact按鈕將其加入到上傳列別中
5、Nexus循序用戶一次上傳一個主構件和多個附屬構件(Classifier),單機頁面下方的Upload Artifact(s)按鈕將構件上傳到倉庫中
在組織中使用Nexus的時候每每會有一些安全性需求,例如但願只有管理員才能配置Nexus,只有某些團隊成員才能部署構件,或者更細一些的要求,例如每一個項目都有本身的Nexus宿主倉庫,且只能部署項目構件至該倉庫中
Nexus提供了全面的權限控制特性,能讓用戶自由的根據須要配置Nexus用戶、角色、權限等
Nexus的訪問控制模型
1、Nexus是基於權限(Privilege)作訪問控制的,服務器的每個資源都有相應的權限來控制,所以用戶執行特定的操做時就必須擁有必要的權限
2、管理員必須以角色 (Role)的方式將權限賦予Nexus用戶
Nexus的預約義用戶
Nexus預約義了三個用戶,分別是admin、deployment、anonymous
這三個用戶對應的三個權限級別:
1、admin,該用戶擁有對Nexus服務的徹底控制,默認密碼位admin123
2、deployment,該用戶可以訪問Nexus,瀏覽倉庫內容,搜索,而且上傳部署構件,可是沒法對Nexus進行任何配置,默認密碼爲deployment123
3、anonymous,該用戶對應了全部未登陸的匿名用戶,它們能夠瀏覽倉庫並進行搜索
Nexus預約義的一些經常使用且重要的角色:
1、UI:Basic UI Privileges,包含了訪問Nexus界面必須的最基本的權限
2、UI:Repository Browser,包含了瀏覽倉庫頁面所須要的權限
3、UI:Search,包含了訪問快速搜索欄及搜索頁面所須要的權限
4、Repo:All Repositories (Read),給予用戶讀取全部倉庫內容的權限,沒有倉庫的度權限,用戶將沒法在倉庫頁面上看到實際的倉庫內容,也沒法使用Maven從倉庫下載構件
5、Repo:All Repositores (Full Control),給予用戶徹底控制全部倉庫內容的權限。用戶不只能夠瀏覽,下載構件,還能夠部署構件及刪除倉庫內容
6、Nexus Anonymous Role,特殊的匿名用戶角色,默認配置下沒有登陸的用戶都會擁有該匿名角色的權限。這個匿名用戶角色實際包含了上述所列角色中,除了Repo:All Repositories (Full Control)以外的全部角色所包含的權限。也就是說,匿名用戶能夠訪問基本的Nexus界面、瀏覽倉庫內容及搜索構件
7、UI:Logs and Config Files包含了訪問系統日誌及配置文件所須要的權限
Nexus包含的幾種類型的調度任務
1、Download Indexes:爲代理倉庫下載遠程索引
2、Empty Trash:清空Nexus的回收站,一些操做 (如刪除倉庫文件)實際是將文件移到了回收站中
3、Evict Unused Proxied Items From Repository Caches:刪除代理倉庫中長期未被使用的構建緩存
4、Expire Repository Caches:Nexus爲代理倉庫維護了遠程倉庫的信息以免沒必要要的網絡流量,該任務清空這些信息以強制Nexus去從新獲取遠程倉庫的信息
5、Publish Indexes:將倉庫索引起布成可供m2eclipse和其餘Nexus使用的格式
6、Purge Nexus Timeline:刪除Nexus的時間線文件,該文件用於創建系統的RSS源
7、Rebuild Maven Metadata Files:基於倉庫內容從新建立倉庫元數據文件maven-meta-data.xml,同時從新建立每一個文件的校驗和md5和sha1
8、Reindex Repositories:爲倉庫編撰索引
9:Remove Snapshots From Repository:以可配置的方式刪除倉庫的快照構件
10:Synchronize Shadow Repository:同步虛擬倉庫的內容 (服務於Maven 1)