Nexus是什么
Nexus 是 Sonatype 公司發布的一款倉庫(Repository)管理軟件,常用來搭建 Maven 私服,所以也有人將 Nexus 稱為“Maven倉庫管理器”。
Maven 私服其實並不是 Maven 的核心概念,它僅僅是一種衍生出來的特殊的倉庫,但這並不代表它不重要,相反由於私服具有降低中央倉庫負荷、節省外網帶寬、以及提高項目穩定性等優點,使得私服在實際開發過程中得到了相當普遍地使用。
能夠幫助我們建立私服的軟件被稱為 Maven 倉庫管理器,主要有以下 3 種:
- Apache Archiva
- JFrog Artifactory
- Sonatype Nexus
其中,Sonatype Nexus 是當前最流行,使用最廣泛的 Maven 倉庫管理器。Nexus 分為開源版和專業版,其中開源版足以滿足大部分 Maven 用戶的需求。
Nexus 開源版具有以下特性:
- 占用內存小(28 M 左右)
- 具有基於 ExtJs 得操作界面,用戶體驗較好
- 使用基於 Restlet 的完全 REST API
- 支持代理倉庫、宿主倉庫和倉庫組
- 基於文件系統,不需要依賴數據庫
- 支持倉庫索引以及搜索
- 支持在界面上上傳構件
- 安全控制
Nexus 專業版需要付費購買,它主要包含一些企業級的高級特性,詳情請參考 Sonatype Nexus 官方文檔。
Nexus下載和安裝
目前 Nexus 分為 Nexus 2.x 和 Nexus 3.x 兩個大版本,它們是並行的關系,目前使用最多,運行最穩定的是 Nexus 2.x,下面我們以 Nexus 2.x 為例,演示 Nexus 的安裝過程。
1. 進入 Nexus 2.x 下載頁面,根據本機操作系統,選擇對應的版本進行下載,如下圖所示。
圖1:Nexus 2.x 下載頁面
2. 將下載 Nexus 安裝包解壓到本地磁盤,可獲得 nexus-2.14.20-02 和 sonatype-work 2 個目錄,如下圖。
其中:
- nexus-2.14.20-02:該目錄中包含了 Nexus 2.x 運行所需要的文件,如啟動腳本、依賴 jar 包等。
- sonatype-work:該目錄中包含了 Nexus 2.x 生成的配置文件、日志文件等。
3. nexus-2.14.20-02 中包含以下目錄及文件。
nexus-2.14.20-02 目錄說明,如下表所示。
子目錄 | 說明 |
---|---|
bin | 命令中心(啟動命令,關閉命令) |
conf | 配置中心(管理着倉庫列表、日志配置,以及安全設置) |
lib | Nexus 的庫文件,Nexus 運行時需要的 jar 包所在的目錄 |
logs | 存放日志文件 |
nexus | Nexus 應用程序 |
tmp | 存放Nexus 運行時產生的臨時文件 |
4. .進入 \nexus-2.14.20-02\bin\jsw 文件夾,根須操作系統版本選擇合適的目錄,由於我的操作系統是 Windows 10 64 位,所以我選擇 windows-x86-64 目錄,如下圖所示。
5. 進入 windows-x86-64 目錄后可以看到如下文件。
其中:
- console-nexus.bat:啟動 Nexus 並在 DOS 命令行中展示啟動過程。
- install-nexus.bat:將 Nexus 安裝為 Windows 服務,開機自動啟動。
- start-nexus.bat:啟動 Nexus。
- stops-nexus.bat:停止 Nexus。
- uninstall-nexus.bat:與 install-nexus.bat 相對應,負責卸載 Nexus 服務。
6. 雙擊運行 install-nexus.bat 安裝 Nexus 服務,然后運行 start-nexus.bat 啟動服務。
注意:
- 運行 install-nexus.bat 安裝服務,若提示”wrapper | OpenSCManager failed - 拒絕訪問。 (0x5)“,只要關閉窗口,以管理員身份運行即可解決。
- 運行 start-nexus.bat 啟動服務,若提示”wrapper | OpenSCManager failed - 拒絕訪問。 (0x5)“,只要關閉窗口,以管理員身份運行即可解決。
7. 訪問 http://localhost:8081/nexus,結果如下圖,則表示服務啟動成功,否則表示服務啟動失敗。
8. 點擊首頁右上角的“Log In”按鈕,在登錄頁面輸入用戶名和密碼(默認分別為:admin 和 admin123 ),最后點擊“Log In”按鈕登錄。
9. 登錄成功后,結果如下圖。
Nexus倉庫屬性和分類
Nexus 作為一款 Maven 倉庫管理器,倉庫(Repository)自然是 Nexus 最核心的概念。Nexus 中提供了許多倉庫概念,如代理倉庫、宿主倉庫以及倉庫組等。Nexus 為每一種倉庫都提供了豐富的配置參數,方便我們根據自身需要進行定制。
Nexus 倉庫屬性
點擊左邊導航欄中的 Repositories,可以看到 Nexus 自帶的幾個內置倉庫,如下圖所示。
在倉庫列表中,每個倉庫都具有一系列屬性:
- Type:倉庫的類型,Nexus 中有 4 中倉庫類型:group(倉庫組)、hosted(宿主倉庫)、proxy(代理倉庫)以及 virtual(虛擬倉庫)。
- Format:倉庫的格式。
- Policy:倉庫的策略,表示該倉庫是發布(Release)版本倉庫還是快照(Snapshot)版本倉庫。
- Repository Status:倉庫的狀態。
- Repository Path:倉庫的路徑。
由圖 1 可知,Nexus 2.x 默認創建了 6 個倉庫,我們稱它們為 Nexus 內置倉庫。
- Maven Central:該倉庫用來代理 Maven 中央倉庫,其策略為 Release,只會下載和緩存中央倉庫中的發布版本的構件。
- Releases:策略為 Release 的宿主倉庫,用來部署公司或組織內部的發布版本構件。
- Snapshots:策略為 Snapshot 的宿主倉庫,用來部署公司或組織內部的快照版本構件。
- 3rd party:策略為 Release 的宿主倉庫,用來部署第三方發布版本構件,這些構件一般無法從任何遠程倉庫中獲得。
- Public Repositories:該倉庫組將上述所有存儲策略為 Release 的倉庫聚合並通過統一的地址提供服務。
Nexus 倉庫分類
Nexus 倉庫按照類型(Type)區分,主要分為以下 3 個類型:
- 代理倉庫(proxy):用來代理遠程公共倉庫,如 Maven 中央倉庫、JBoss 遠程倉庫。
- 宿主倉庫(hosted):又稱 Nexus 本地倉庫,該倉庫通常用來部署本地項目所產生的構件。
- 倉庫組(group):用來聚合代理倉庫和宿主倉庫,為這些倉庫提供統一的服務地址,以便 Maven 可以更加方便地獲得這些倉庫中的構件。
為了更加直觀的理解倉庫組、代理倉庫和宿主倉庫的概念,我們通過下圖展示它們的用途和區別。
由上圖可知:
- Maven 可以直接從宿主倉庫中下載構件。
- Maven 也可以從代理倉庫中下載構件,代理倉庫會從遠程倉庫下載並緩存構件。
- Maven 還可以從倉庫組中下載構件,倉庫組會從其包含的宿主倉庫和代理倉庫中獲取構件。
本節,我們將介紹如何創建自定義宿主倉庫、代理倉庫和倉庫組,為后面的工作做准備。
創建 Nexus 宿主倉庫
首先,我們需要創建兩個宿主倉庫,分別用來存儲從本地上傳到 Nexus 的 Snapshot 和 Release 版本的構件,操作步驟如下。
1. 點擊左邊導航欄中的 Repositories,如下圖。
2. 點擊 Nexus 倉庫列表上方的 Add... 按鈕,在下拉菜單中選擇 Hosted Repository,如下圖。
3. 在宿主倉庫配置界面,填寫對應信息,然后點擊 Save 按鈕進行保存,如下圖。
宿主倉庫配置如下:
配置 | 說明 |
---|---|
Repository ID | 倉庫 ID。 |
Repository Name | 倉庫名稱。 |
Repository Type | 倉庫的類型,如 hosted、proxy 等等。 |
Provider | 用來確定倉庫的格式,一般默認選擇 Maven2。 |
Repository Policy | 倉庫的策略。 |
Default Local Storage Location | 倉庫默認存儲目錄,例如 D:\nexus-2.14.20-02-bundle\sonatype-work\nexus\indexer\bianchengbang_Snapshot_hosted_ctx。 |
Override Local Storage Location | 自定義倉庫存儲目錄。 |
Deployment Policy | 倉庫的部署策略。 |
Allow File Browsing | 用來控制是否允許瀏覽倉庫內容,一般選擇 true。 |
Include in Search | 用來控制該倉庫是否創建索引並提供搜索功能。 |
Publish URL | 用來控制是否通過 URL 提供服務。 |
Not Found Cache TTL | 緩存某構件不存在信息的時間,默認取值為 1440,表示若某一個構件在倉庫中沒有找到,在 1440 分鍾內再次接收到該構件的請求,則直接返回不存在信息,不會再次查找。 |
4. 查看 Nexus 倉庫列表,可以看到自定義的宿主倉庫已經創建完成,如下圖。
重復以上步驟,再創建一個名稱為 bianchengbang_Release_hosted ,策略為 hosted 的宿主倉庫。
創建 Nexus 代理倉庫
下面我們創建一個代理倉庫,用來下載和緩存中央倉庫的構件,操作步驟如下。
點擊 Nexus 倉庫列表上方的 Add... 按鈕,在下拉菜單中選擇 Proxy Repository,如圖 5 所示。
在代理倉庫配置界面,填寫對應信息,然后點擊 Save 按鈕進行保存,如圖 6 所示。
代理倉庫配置中,倉庫 ID、倉庫名稱、Provider、Policy 以及 Default Local Storage Location 等配置的含義與宿主倉庫相同,不再贅述。需要注意的是,代理倉庫的 Repository Type 的取值是 proxy。
代理倉庫配置如下表。
配置 | 說明 |
---|---|
Remote Storage Location | 遠程倉庫或中央倉庫的地址,它是 Nexus 代理倉庫最重要得配置,必須輸入有效值,通常取值為 https://repo1.maven.org/maven2/。 |
Download Remote Indexes | 是否下載遠程倉庫的索引。 |
Auto Blocking Enabled | 是否啟用自動阻止,即當 Nexus 無法連接中央倉庫或遠程倉庫時,是否一直等待。取值為 true 表示不再等待,直接通知客戶端無法連接,並返回。 |
File Content Validation | 是否啟用文件內容校驗。 |
Checksum Policy | 配置校驗和出錯時的策略,用戶可以選擇忽略、警告、記錄警告信息或拒絕下載等多種策略。 |
Artifact Max Age | 構件緩存的最長時間,對於發布版本倉庫來說,默認值為 -1,表示構件緩存后,就一直保存着,不再重新下載。對於快照版本倉庫來說,默認值為 1440 分鍾,表示每隔一天重新緩存一次代理的構件。 |
Metadata Max Age | 倉庫元數據緩存的最長時間。 |
Item Max Age | 項目緩存的最長時間。 |
創建 Nexus 倉庫組
下面我們將創建一個倉庫組,並將剛剛創建的 3 個倉庫都聚合起來,操作步驟如下。
點擊倉庫列表上方的 Add... 按鈕,在下拉菜單中選擇 Repository Group,如下圖。
在倉庫組配置界面,填寫對應信息,並將 bianchengbang_central_proxy、bianchengbang_Release_hosted 和 bianchengbang_Snapshot_hosted 3 個倉庫添加到倉庫組中,最后點擊 Save 按鈕進行保存,如下圖。
查看 Nexus 倉庫列表,可以看到 bianchengbang_repository_group 倉庫組已經創建完成,如下圖。
圖9:Nexus 倉庫列表-倉庫組