一.簡介
nexus是一個強大的maven倉庫管理器,作用是代理遠程倉庫及部署第三方構件,它極大的簡化了本地內部倉庫的維護和外部倉庫的訪問。nexus是一套開箱即用的系統不需要數據庫,它使用文件系統加Lucene來組織數據
Nexus 專業版是需要付費的,其開源版為 Nexus OSS。Nexus 提供兩種安裝包,一種是包含 Jetty 容器的 bundle 包,另一種是不包含容器的 war 包。
下載地址:http://www.sonatype.org/nexus/go。
nexus使用ExtJS來開發界面,利用Restlet來提供完整的REST APIs,通過IDEA和Eclipse集成使用,支持webDAV與LDAP安全身份認證,提供了強大的倉庫管理功能,構件搜索功能,它基於REST,友好的UI是一個extjs的REST客戶端,占用較少的內存,基於簡單文件系統而非數據庫
二.好處
- 加速構建
- 節省帶寬
- 節省中央maven倉庫的帶寬
- 穩定(應付一旦中央服務器出問題的情況)
- 控制和審計
- 能夠部署第三方構件
- 可以建立本地內部倉庫和公共倉庫
- 開箱即用,不需要數據庫
- 占用較少的內存,基於簡單文件系統而非數據庫
這些優點使得Nexus日趨成為最流行的Maven倉庫管理器。
三.倉庫
倉庫分類
hosted 宿主倉庫:主要用於部署無法從公共倉庫獲取的構件(如 oracle 的 JDBC 驅動)以及自己或第三方的項目構件
proxy 代理倉庫:代理公共的遠程倉庫
virtual 虛擬倉庫:用於適配 Maven 1
group 倉庫組:Nexus 通過倉庫組的概念統一管理多個倉庫,這樣我們在項目中直接請求倉庫組即可請求到倉庫組管理的多個倉庫

1)Maven可直接從宿主倉庫下載構件,也可以從代理倉庫下載構件,而代理倉庫間接的從遠程倉庫下載並緩存構件
2)為了方便,Maven可以從倉庫組下載構件,而倉庫組並沒有時間的內容(下圖中用虛線表示,它會轉向包含的宿主倉庫或者代理倉庫獲得實際構件的內容)

所有倉庫在本地都會有一個文件夾存放各自緩存的jar!
Nexus默認內置的倉庫
Nexus 可能內置了如下倉庫(不同版本可能不同):
- Maven Central :代理 Maven 的中央倉庫,策略為 release
- Releases :策略為 Release的宿主類倉庫,用來部署組織內部的 release 版本構件 Snapshots :策略為 Snapshot的宿主類倉庫,用來部署組織內部的 release 版本構件
- 3rd party :策略為 Release的宿主類倉庫,用來部署無法從公共倉庫獲得的第三方 release 版構件。
- Apache Snapshots :代理 Apache Maven 倉庫,策略為Snapshot
- Codehaus Snapshots :代理 Codehaus Maven 倉庫,策略為Snapshot
- Google Code :代理 Google Code Maven 倉庫,策略為 Release
- Java.net – Maven 2 :代理 Java.net Maven 倉庫,策略為Release
- Public Repositories :將上述策略為 Release 的倉庫聚合並通過一致的地址提供服務。
- Public Snapshot Repositories :將上述策略為 Snapshot 的倉庫聚合並通過一致的地址提供服務。
各類倉庫配置詳解
** Hosted倉庫**
創建 Nexus 宿主倉庫時,倉庫會默認地存放在 sonatype-work/nexus/storage/[repository-id]/ 下,也可以填寫 Override Local Storage Location 自定義倉庫的存儲路徑。同時可以設置以下選項:
- Deployment Policy :只讀(禁止部署)、關閉多次部署(同一構件只能部署一次)或允許多次部署。
- Allow File Browser :設置是否允許在 Repository 的 Browse Storage 選項卡中瀏覽倉庫。
- Include in Search :設置是否對該倉庫進行索引並暴露給搜索。
- Publish URL :設置是否通過 URL 提供服務,如為 false ,訪問該倉庫的地址時會得到 404
- Not Found Cache TTL :緩存未找到文件信息的時間(此時間內不再去找,直接返回沒找到)
Proxy倉庫
創建 Nexus 代理倉庫時,除了設置遠程倉庫的地址和認證信息外,還可以設置以下選項:
- Download Remote Indexes :設置是否下載遠程倉庫的索引。(下載遠程倉庫的索引后,即使沒有緩存遠程倉庫的構件,用戶依然能搜索或瀏覽構件的基本信息)
- Checksum Policy :設置校驗和出錯時,是忽略、記錄警告信息還是拒絕下載。
- Artifact Max Age :設置多久更新一次 Artifact (對於策略為 release 的倉庫,可以設置為 -1 ,也就是永不更新)
- Metadata Max Age :設置多久更新一次 metadata 。
Public倉庫
倉庫策略分為 release 與 snapshot,一般用在 proxy倉庫 和 hosted倉庫,分別表示發布版和快照版。而倉庫組沒有 Release 和 Snapshot 的區別,創建時會讓用戶選擇由哪些宿主倉庫或代理倉庫構成。倉庫組所包含的倉庫的順序決定了倉庫組遍歷它們的次序,所以最好將常用的倉庫放在前面。

四.Nexus的索引
Nexus 通過維護倉庫的索引來提供搜索功能。
遠程索引:這里只針對代理倉庫,其他倉庫不存在遠程索引一說。配置好遠程倉庫后,搜索時仍然是不能搜到遠程倉庫的任意文件的。為了能搜索到遠程倉庫的所有文件,我們需要開啟 Nexus 中的代理倉庫下載遠程索引(默認這個設置是關閉的)。
只要遠程倉庫提供 nexus-indexer 形式的索引, Nexus 就可以下載它的索引。這樣在你搜索時,無論私服本地是否存在相應文件,都能被搜索到,然后項目引用時,nexus會去遠程倉庫下載,並緩存在本地。
Hosted倉庫: Nexus 也可以對宿主倉庫和代理倉庫進行索引。倉庫有了索引之后,可以在其 Browse Index 選項卡中瀏覽倉庫內容的樹形結構。
五.目錄結構
配置文件:nexus/conf/nexus.properties
倉庫目錄:nexus/sonatype-work
根目錄
- nexus-3.5.2-01 安裝目錄
- sonatype-work\nexus3 數據文檔
nexus-3.5.2-01 目錄
- bin 包含nexus的啟動腳本和相關配置
- etc jetty、karaf等配置文件
- jre jre環境
- lib java架包庫
- public 關於nexus應用在本地跑起來所需要的資源
- system 應用所有的插件和組件
- LICENSE.txt 和 NOTICE.txt 版權聲明和法律細則
sonatype-work\nexus3 目錄
- blobs/ 創建blob的默認路徑,當然也可以重新指定
- cache/ 當前緩存的karaf包的信息
- db/ OrientDB數據庫的數據,用於存儲nexus的元數據的數據庫
- elasticsearch/ 當前配置的Elasticsearch狀態
- etc/ 大概是運行時配置狀態和關於資源庫的自定義的相關的東西
- health-check/ 看目錄,健康檢查的相關報告的存儲目錄吧
- keystores/ 自動生成的關於資源庫的ID主鍵
- log/ 運行實例生成的日志文件,也有日志文件的壓縮包,貌似是每天都會生成日志文件,你可以定期刪除老的日志文件
- tmp/ 用於存儲臨時文件的目錄
具體每個目錄下的各個配置文件的作用,還可參考官方文檔說明:https://help.sonatype.com/display/NXRM3/Installation
六.版本比較
目前Nexus已升級到3.x,簡單做下淺顯比較:
- 3.x版本界面漂亮

- 3.x對於jar的本地緩存不再是像2.x一樣,直接保存單個jar包,而是采用Blob Stores保存,即一個jar被保存為單bytes文件。因此將沒法使用:直接批量扔jar,再手動更新這種方式。
- 相比2.x,自帶JAVA環境,安裝方便
- 支持管理Docker
- 支持npm和bower的package管理
- 不能再像2.x一樣,點擊相關jar后含有出現
,方便復制粘貼
