長(zhǎng)沙做網(wǎng)站推廣哪家好惠州網(wǎng)站制作推廣
Maven · 使用 Nexus 創(chuàng)建私服
- 1?? Nexus簡(jiǎn)介
- 2?? 安裝 Nexus
- 2.1 下載 Nexus
- 2.2 Bundle 方式安裝 Nexus
- 2.3 WAR 方式安裝 Nexus
- 2.4 登錄 Nexus
- 3?? Nexus 的倉庫與倉庫組
- 3.1 Nexus 內(nèi)置的倉庫
- 3.2 Nexus 倉庫分類的概念
- 3.3 創(chuàng)建 Nexus 宿主倉庫
- 3.4 創(chuàng)建 Nexus 代理倉庫
- 3.5 創(chuàng)建 Nexus 倉庫組
- 4?? Nexus 的索引與構(gòu)件搜索
- 5?? 配置 Maven從 Nexus下載構(gòu)件
- 6?? 部署構(gòu)件至 Nexus
- 6.1 使用 Maven 部署構(gòu)件至 Nexus
- 6.2 手動(dòng)部署第三方構(gòu)件至 Nexus
- 7?? Nexus 的權(quán)限管理
- 7.1 Nexus 的訪問控制模型
- 7.2 為項(xiàng)目分配獨(dú)立的倉庫
- 8?? Nexus的調(diào)度任務(wù)
- 9?? 其他私服軟件
- 🌾 總結(jié)
私服不是Maven 的核心概念,它僅僅是一種衍生出來的特殊的Maven 倉庫,前面已經(jīng)解釋過了其概念和用途,然而這還不夠。通過建立自己的私服,就可以降低中央倉庫負(fù)荷、節(jié)省外網(wǎng)帶寬、加速 Maven 構(gòu)建、自己部署構(gòu)件等,從而高效地使用Maven。
有三種專門的Maven 倉庫管理軟件可以用來幫助大家建立私服: Apache 基金會(huì)的Archiva
、JFrog 的 Artifactory
和 Sonatype 的 Nexus
。 其中, Archiva
是開源的,而 Artifactory
和 Nexus
的核心也是開源的,因此大家可以自由選擇使用。個(gè)人比較推崇 Nexus
。事實(shí)上,Nexus
也是當(dāng)前最流行的 Maven 倉庫管理軟件。本文將介紹 Nexus
的主要功能,并結(jié)合圖片幫助大家快速地建立起自己的 Maven 私服。
1?? Nexus簡(jiǎn)介
2005年12月,Tamas Cservenak 由于受不了匈牙利電信ADSL
的低速度,開始著手開發(fā)
Proximity
—一個(gè)很簡(jiǎn)單的 Web 應(yīng)用。它可以代理并緩存 Maven 構(gòu)件,當(dāng) Maven 需要下載構(gòu)件的時(shí)候,就不需要反復(fù)依賴于ADSL
。 到2007年, Sonatype 邀請(qǐng) Tamas 參與創(chuàng)建一個(gè)更酷的 Maven 倉庫管理軟件,這就是后來的 Nexus
。
Nexus 團(tuán)隊(duì)的成員來自世界各地,它也從社區(qū)收到了大量反饋和幫助,現(xiàn)在 Nexus
已經(jīng)發(fā)布到了 3.60.0 版本,它也正健康快速地成長(zhǎng)著。Nexus分為開源版和專業(yè)版,其中開源版本基于GPLx3 許可證,其特性足以滿足大部分 Maven用戶的需要。
以下是一些 Nexus 開源版本的特性:
- 較小的內(nèi)存占用 (最少僅為28MB)
- 基于 ExtJS 的友好界面
- 基于 Restlet 的完全 REST API
- 支持代理倉庫、宿主倉庫和倉庫組
- 基于文件系統(tǒng),不需要數(shù)據(jù)庫
- 支持倉庫索引和搜索
- 支持從界面上傳Maven 構(gòu)件
- 細(xì)粒度的安全控制
Nexus專業(yè)版本是需要付費(fèi)購買的,除了開源版本的所有特性之外,它主要包含一些企
業(yè)安全控制、發(fā)布流程控制等需要的特性。感興趣的朋友可以訪問該地址了解詳情:
https://help.sonatype.com/repomanager3/product-information/download
2?? 安裝 Nexus
Nexus是典型的Java Web應(yīng)用,它有兩種安裝包,一種是包含 Jetty
容器的 Bundle
包 , 另一種是不包含 Web 容器的 war包。
2.1 下載 Nexus
首先從 Nexus下載地址 下載最新版本的 Nexus。大家可以根據(jù)需要下載對(duì)應(yīng)安裝包 nexus-3.60.0-02-win64.zip
(Windows系統(tǒng)) 、nexus-3.60.0-02-unix.tar.gz
(Linux系統(tǒng))或者 nexus-3.60.0-02-mac.tgz
(MAC系統(tǒng))。
2.2 Bundle 方式安裝 Nexus
2.X 舊版本的 Nexus 是 Bundle
安裝包,所以本節(jié)介紹下這種安裝包的安裝方式。Bundle 自帶了Jetty 容器,因此用戶不需要額外的Web 容器就能直接啟動(dòng) Nexus。首
先將 Bundle 文件解壓,解壓后會(huì)得到如下兩個(gè)子目錄:
nexus-xxx/
:該目錄包含了Nexus 運(yùn)行所需要的文件,如啟動(dòng)腳本、依賴
jar包等。sonatype-work/
:該目錄包含Nexus 生成的配置文件、日志文件、倉庫文件等。
其中,第一個(gè)目錄是運(yùn)行Nexus 所必需的,而且所有相同版本 Nexus實(shí)例所包含的該目錄內(nèi)容都是一樣的。而第二個(gè)目錄不是必須的, Nexus 會(huì)在運(yùn)行的時(shí)候動(dòng)態(tài)創(chuàng)建該目錄,不過它的內(nèi)容對(duì)于各個(gè)Nexus 實(shí)例是不一樣的,因?yàn)椴煌脩粼诓煌瑱C(jī)器上使用的 Nexus 會(huì)有不同的配置和倉庫內(nèi)容。當(dāng)用戶需要備份 Nexus 的時(shí)候,默認(rèn)備份sonatype-work/
目錄,因?yàn)樵撃夸?包含了用戶特定的內(nèi)容,而 nexus-xxx
目錄下的內(nèi)容是可以從安裝包直接獲得的。
用戶只需要調(diào)用對(duì)應(yīng)操作系統(tǒng)的腳本就可以啟動(dòng) Nexus, 這里介紹主流的在 Windows 和 Linux 平臺(tái)上啟動(dòng) Nexus 的方式。
在 Windows 操作系統(tǒng)上,用戶需進(jìn)入 nexus-xxx/bin/jsw/windows-x86-32/
子目錄,然后直接運(yùn)行 start-nexus.bat
腳本就能啟動(dòng) Nexus。運(yùn)行 console-nexus.bat
腳本,如果看到如下輸出(部分日志已省略),就說明啟動(dòng)成功了:
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
...
jvm 1 | 2023-09-27 15:02:15,539+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - application-host='0.0.0.0'
jvm 1 | 2023-09-27 15:02:15,539+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - application-port='8081'
jvm 1 | 2023-09-27 15:02:15,539+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - bundleBasedir='D:\MyApp\nexus-2.14.5-02-bundle\nexus-2.14.5-02'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - java.awt.headless='true'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - networkaddress.cache.ttl='3600'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - nexus-app='D:\MyApp\nexus-2.14.5-02-bundle\nexus-2.14.5-02/nexus/WEB-INF'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - nexus-webapp='D:\MyApp\nexus-2.14.5-02-bundle\nexus-2.14.5-02/nexus'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - nexus-webapp-context-path='/nexus'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - nexus-work='D:\MyApp\nexus-2.14.5-02-bundle\sonatype-work\nexus'
jvm 1 | 2023-09-27 15:02:15,540+0800 INFO [WrapperListener_start_runner] org.sonatype.nexus.bootstrap.ConfigurationBuilder - org.eclipse.ecf.provider.filetransfer.retrieve.readTimeout='30000'
...
jvm 1 | 2023-09-27 15:02:18,253+0800 INFO [jetty-main-1] org.sonatype.nexus.NxApplication -
jvm 1 | -------------------------------------------------
jvm 1 |
jvm 1 | Initializing Nexus Repository Manager OSS 2.14.5-02
jvm 1 |
jvm 1 | -------------------------------------------------
jvm 1 | 2023-09-27 15:02:18,254+0800 INFO [jetty-main-1] org.sonatype.nexus.NxApplication - Activating locally installed plugins...
jvm 1 | 2023-09-27 15:02:20,817+0800 INFO [jetty-main-1] com.sun.jersey.server.impl.application.WebApplicationImpl - Initiating Jersey application, version 'Jersey: 1.17.1 02/28/2013 12:47 PM'
jvm 1 | 2023-09-27 15:02:22,051+0800 INFO [jetty-main-1] org.sonatype.nexus.plugins.bcprov.CryptoPlugin - Unlimited strength JCE policy detected
jvm 1 | 2023-09-27 15:02:23,794+0800 INFO [jetty-main-1] org.sonatype.nexus.kazuki.KazukiPlugin - Kazuki version: 0.1.8
jvm 1 | 2023-09-27 15:02:26,272+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.WebSiteRepository:site).
jvm 1 | 2023-09-27 15:02:26,566+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.GroupRepository:npm-group).
jvm 1 | 2023-09-27 15:02:26,566+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.Repository:npm-hosted).
jvm 1 | 2023-09-27 15:02:26,566+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.Repository:npm-proxy).
jvm 1 | 2023-09-27 15:02:26,691+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.ShadowRepository:nuget-shadow).
jvm 1 | 2023-09-27 15:02:26,691+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.GroupRepository:nuget-group).
jvm 1 | 2023-09-27 15:02:26,691+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.Repository:nuget-proxy).
jvm 1 | 2023-09-27 15:02:29,092+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.GroupRepository:rubygems-group).
jvm 1 | 2023-09-27 15:02:29,092+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.Repository:rubygems-hosted).
jvm 1 | 2023-09-27 15:02:29,092+0800 INFO [jetty-main-1] org.sonatype.nexus.proxy.registry.DefaultRepositoryTypeRegistry - Registered Repository type RepositoryType=(org.sonatype.nexus.proxy.repository.Repository:rubygems-proxy).
jvm 1 | 2023-09-27 15:02:30,490+0800 INFO [jetty-main-1] org.sonatype.nexus.NxApplication - Plugin manager request "ACTIVATE" on plugin "org.sonatype.nexus.plugins:nexus-atlas-plugin:2.14.5-02" was successful.
...
jvm 1 | 2023-09-27 15:02:31,175+0800 INFO [jetty-main-1] org.sonatype.nexus.orient.DatabaseServerImpl - Activated
jvm 1 | 2023-09-27 15:02:31,175+0800 INFO [jetty-main-1] org.sonatype.nexus.configuration.application.DefaultNexusConfiguration - Loading Nexus Configuration...
jvm 1 | 2023-09-27 15:02:31,183+0800 INFO [jetty-main-1] org.sonatype.nexus.configuration.source.StaticConfigurationSource - Configuration loaded successfully.
...
這時(shí),打開瀏覽器訪問 http://localhost:8081/nexus/ 就能看到 Nexus 的界面,如圖所示。
要停止 Nexus, 可以在命令行按 Clrl+C 鍵。在 nexus-xxx/bin/jsw/windows-x86-32/
目錄下還有其他一些腳本:
install-nexus.bat
:將 Nexus 安裝成 Windows 服務(wù)。uninstall-nexus.bat
:卸載 Nexus Windows 服務(wù)。start-nexus.bat
:啟動(dòng) Nexus Windows 服務(wù)。stop-nexus.bat
:停止 Nexus Windows 服務(wù)。pause-nexus.bat
:暫停 Nexus Windows 服務(wù)。resume-nexus.bat
:恢復(fù)暫停的 Nexus Windows 服務(wù)。
借助 Windows 服務(wù),用戶就可以讓 Nexus 伴隨著 Windows 自動(dòng)啟動(dòng),非常方便。
在Linux系統(tǒng)上啟動(dòng) Nexus也非常方便,例如使用 Ubuntu32位系統(tǒng),那么只需要進(jìn)入到nexus-xxx/bin/jsw/linux-x86-32/
,然后運(yùn)行如下命令:
$ . /nexus console
同樣地,讀者可以看到 Nexus啟動(dòng)的命令行輸出,并且可以使用 Ctrl+C鍵停止 Nexus。
除了console之外,Nexus的Linux腳本還提供如下的命令:
./nexus start
: 在后臺(tái)啟動(dòng) Nexus服務(wù)。./nexus stop
: 停止后臺(tái)的 Nexus服務(wù)。./nexus status
: 查看后臺(tái) Nexus服務(wù)的狀態(tài)。./nexus restart
: 重新啟動(dòng)后臺(tái)的Nexus服務(wù)。
關(guān)于Bundle 安裝的一個(gè)常見問題是端口沖突。Nexus Bundle默認(rèn)使用的端口是8081,
如果該端口已經(jīng)被其他應(yīng)用程序占用,或者你想使用80端口開放Nexus服務(wù),則編輯文件 nexus-xxx/conf/nexus.properties
, 找到屬性 application-port
, 按需要將默認(rèn)值 8081改成其他端口號(hào),然后保存該文件,重啟Nexus便可。
2.3 WAR 方式安裝 Nexus
除了 Bundle, Nexus還提供一個(gè)可以直接部署到Web容器中的war包。該war包支持主流的Web容器,如Tomcat、Glassfish、Jetty 和 Resin
。
以Tomcat6為例,我在 Vista機(jī)器上的目錄為 D:\bin\apache-tomcat-6.0.20\
, 那么只需要復(fù)制 Nexus war包至 Tomcat的部署目錄 D:\bin\apache-tomcat-6.0.20\webapps\nexus.war
, 然后轉(zhuǎn)到 D:\bin\apache-tomcat-6.0.20\bin\
目錄,運(yùn)行腳本 startup.bat
。這時(shí),便可以從Tomcat的 console輸出中看到它部署nexus.war。
待Tomcat啟動(dòng)完成后,訪問 http://localhost:8080/nexus/
就能看到Nexus的界面了。
2.4 登錄 Nexus
Nexus擁有全面的權(quán)限控制功能,默認(rèn)的Nexus訪問都是匿名的,而匿名用戶僅包含一些 最基本的權(quán)限,要全面學(xué)習(xí)和管理Nexus, 就必須以管理員方式登錄??梢詥螕艚缑嬗疑辖堑?Log In
進(jìn)行登錄, Nexus的默認(rèn)管理員用戶名和密碼為 admin/admin123
, 如圖所示。
3?? Nexus 的倉庫與倉庫組
作為Maven 倉庫服務(wù)軟件,倉庫自然是Nexus 中最重要的概念。 Nexus 包含了各種類型 的倉庫概念,包括代理倉庫、宿主倉庫和倉庫組等。每一種倉庫都提供了豐富實(shí)用的配置參數(shù),方便用戶根據(jù)需要進(jìn)行定制。
3.1 Nexus 內(nèi)置的倉庫
在具體介紹每一種類型的倉庫之前,先瀏覽一下 Nexus 內(nèi)置的一些倉庫。單擊Nexus界
面左邊導(dǎo)航欄中的 Repositories
鏈接,就能在界面右邊看到如圖所示的內(nèi)容。
這個(gè)列表已經(jīng)包含了所有類型的 Nexus 倉庫。從中可以看到倉庫有四種類型: group
(倉庫組)、 hosted
(宿主)、 proxy
(代理) 和 vitual
(虛擬)。每個(gè)倉庫的格式為 maven2
或者 maven1
。 此外,倉庫還有一個(gè)屬性為 Policy
(策略), 表示該倉庫為發(fā)布 (Release) 版本倉庫還是快照 (Snapshot) 版本倉庫。最后兩列的值為倉庫的狀態(tài)和路徑。
下面解釋一下各個(gè)倉庫的用途,maven1 格式的倉庫暫時(shí)省略。此外,由于虛擬類型倉庫的作用實(shí)際上是動(dòng)態(tài)地將倉庫內(nèi)容格式轉(zhuǎn)換,換言之也是為了服務(wù) maven1 格式,因此省略。
Maven Central
: 該倉庫代理 Maven 中央倉庫,其策略為Release, 因此只會(huì)下載和緩 存中央倉庫中的發(fā)布版本構(gòu)件。Releases
: 一個(gè)策略為Release 的宿主類型倉庫,用來部署組織內(nèi)部的發(fā)布版本構(gòu)件。Snapshots
: 一個(gè)策略為Snapshot 的宿主類型倉庫,用來部署組織內(nèi)部的快照版本構(gòu)件。3rd party
: 一個(gè)策略為Release 的宿主類型倉庫,用來部署無法從公共倉庫獲得的第三方發(fā)布版本構(gòu)件。Apache Snapshots
: 一個(gè)策略為Snapshot 的代理倉庫,用來代理Apache Maven倉庫的快照版本構(gòu)件。Codehaus Snapshots
: 一個(gè)策略為Snapshot 的代理倉庫,用來代理 Codehaus Maven 倉庫的快照版本構(gòu)件。Google Code
: 一個(gè)策略為 Release 的代理倉庫,用來代理 Google Code Maven 倉庫的發(fā)布版本構(gòu)件。java.net-Maven 2
: 一個(gè)策略為Release 的代理倉庫,用來代理 java.net Maven 倉庫的發(fā)布版本構(gòu)件。Public Repositories
: 該侖庫組將上述所有策略為 Release 的倉庫聚合并通過一致的地 址提供服務(wù)。Public Snapshot Repositories
: 該倉庫組將上述所有策略為Snapshot 的倉庫聚合并通過一致的地址提供服務(wù)。
舉一個(gè)簡(jiǎn)單的例子。假設(shè)某公司建立了Maven 項(xiàng)目X, 公司內(nèi)部建立了Nexus 私服,為 所有 Maven 項(xiàng)目提供服務(wù)。項(xiàng)目X 依賴于很多流行的開源類庫如 JUnit 等,這些構(gòu)件都能從 Maven 中央倉庫獲得,因此 Maven Central 代理倉庫會(huì)被用來代理中央倉庫的內(nèi)容,并在私服上緩存下來, X 還依賴于某個(gè) Google Code的項(xiàng)目,其構(gòu)件在中央倉庫中不存在,只存在于Google Code的倉庫中,因此上述列表中的 Google Cole 代理倉庫會(huì)被用來代理并緩存這樣的構(gòu)件。
X 還依賴于 Oracle的 JDBC 驅(qū)動(dòng),由于版權(quán)的因素,該類庫無法從公共倉庫獲得, 因此公司管理員將其部署到 3rd party宿主倉庫中,供X 使用。 X 的快照版本構(gòu)件成功后,會(huì)被部署到 Snapshots 宿主倉庫中,供其他項(xiàng)目使用。當(dāng)X 發(fā)布正式版本的時(shí)候,其構(gòu)件會(huì)被部署到 Release宿主倉庫中。由于X 用到了上述列表中的很多倉庫,為每個(gè)倉庫聲明 Maven 配置又比較麻煩,因此可以直接使用倉庫組 Publie Repositories 和 Public Snapshot Repositories, 當(dāng) X 需要 JUnit的時(shí)候,它直接從 Public Repositories 下載,Public Repositories會(huì)選擇 Maven Central 提供實(shí)際的內(nèi)容。
3.2 Nexus 倉庫分類的概念
為了幫助理解宿主倉庫、代理倉庫和倉庫組的概念,下圖用更為直觀的方式展現(xiàn)了它們的用途和區(qū)別。
從圖中可以看到, Maven 可以直接從宿主倉庫下載構(gòu)件; Maven 也可以從代理倉庫下載構(gòu)件,而代理倉庫會(huì)間接地從遠(yuǎn)程倉庫下載并緩存構(gòu)件;最后,為了方便, Maven 可 以從倉庫組下載構(gòu)件,而倉庫組沒有實(shí)際內(nèi)容(圖中用虛線表示), 它會(huì)轉(zhuǎn)向其包含的宿主 倉庫或者代理倉庫獲得實(shí)際構(gòu)件的內(nèi)容。
3.3 創(chuàng)建 Nexus 宿主倉庫
要?jiǎng)?chuàng)建一個(gè)宿主倉庫,首先單擊界面左邊導(dǎo)航欄中的Repositories
鏈接,在右邊的面板中,選擇Add
, 接著在下拉菜單中選擇 Hosted Repository
, 就會(huì)看到圖示的配置界面。
根據(jù)自己的需要填入倉庫的 ID 和名稱,下一字段Repository Type
表示該倉庫的類型。 Provider
用來確定該倉庫的格式。 一般來說,選擇默認(rèn)的 Maven2 Repository
。 然后是 Repository Policy
, 可以根據(jù)自己的需要來配置該倉庫是發(fā)布版構(gòu)件倉庫還是快照版構(gòu)件倉庫。 Default Local Stornge Location
表示該倉庫的默認(rèn)存儲(chǔ)目錄,圖中該字段的值為空,待倉庫創(chuàng)建好之后,該值就會(huì)成為基于 sonatype-work 的一個(gè)文件路徑,如 sonatype-work/nexus/storage/repository-id/
, Override Local Storage Location
可以用來配置自定義的倉庫目錄位置。
在Access Settings
小組中, Deployment Policy
用來配置該倉庫的部署策略,選項(xiàng)有只讀 (禁止部署)、關(guān)閉重新部署(同一構(gòu)件只能部署一次)以及允許重新部署。 Allow File Browsing
表示是否允許瀏覽倉庫內(nèi)容, 一般選True。 每個(gè)倉庫(包括代理倉庫和倉庫組) 都有一個(gè)Browse Storage
選項(xiàng)卡,用戶以樹形結(jié)構(gòu)瀏覽倉庫存儲(chǔ)文件的內(nèi)容,如下圖所示。
Include in Search
表示是否對(duì)該倉庫進(jìn)行索引并提供搜索,我們會(huì)在后面文章詳細(xì)討論索 引和搜索。 Publish URL
用來控制是否通過URL 提供服務(wù),如果選 False, 當(dāng)訪問該倉庫的地址時(shí),會(huì)得到 HTTP 404 Not Found 錯(cuò)誤。配置中最后的 Not Found Cache TTL
表示當(dāng)一個(gè)文件沒有找到后,緩存這一不存在信息的時(shí)間。以默認(rèn)值1440分鐘為例,如果某文件不存在,那么在之后的1440分鐘內(nèi),如果 Nexus 再次得到該文件的請(qǐng)求,它將直接返回不存在信息,而不會(huì)查找文件系統(tǒng)。這么做是為了避免重復(fù)的文件查找操作以提升性能。
3.4 創(chuàng)建 Nexus 代理倉庫
首先單擊界面左邊導(dǎo)航欄中的 Repositories
鏈接,在右邊的面板中,選擇 Add...
, 接著在下拉菜單中選擇 Proxy Repository
, 就會(huì)看到如圖所示的配置界面。
倉庫的ID、 名稱、Provider、Format、Policy、 默認(rèn)本地存儲(chǔ)位置和覆蓋本地存儲(chǔ)位置等 配置前面都已提過,這里不再贅述。需要注意的是,這里的 Repository Type
的值為 proxy。
對(duì)于代理倉庫來說,最重要的是遠(yuǎn)程倉庫的地址,即 Remote Storage Location
,用戶必須在這里輸入有效的值。 Download Remote Indexes
表示是否下載遠(yuǎn)程倉庫的索引,有些遠(yuǎn)程倉庫擁有索引,下載其索引后,即使沒有緩存遠(yuǎn)程倉庫的構(gòu)件,用戶還是能夠在本地搜索 和瀏覽那些構(gòu)件的基本信息。 Checksum Policy
配置校驗(yàn)和出錯(cuò)時(shí)的策略,用戶可以選擇忽略、記錄警告信息或者拒絕下載。當(dāng)遠(yuǎn)程倉庫需要認(rèn)證的時(shí)候,這里的 Authentication
配置就能派上用處。
Access Settings
的配置與宿主倉庫類似,在此不再贅述。 Expiration Settings
較宿主倉庫多了Artifact Max Age
和 Metadata Max Age
。其中,前者表示構(gòu)件緩存的最長(zhǎng)時(shí)間,后者表示 倉庫元數(shù)據(jù)文件緩存的最長(zhǎng)時(shí)間。對(duì)于發(fā)布版?zhèn)}庫來說, Artifact Max Age
默認(rèn)值為 -1 , 表示構(gòu)件緩存后就一直保存著,不再重新下載。對(duì)于快照版?zhèn)}庫來說, Artifact Max Age
默認(rèn)值為1440分鐘,表示每隔一天重新緩存代理的構(gòu)件。
配置中最后兩項(xiàng)為HTTP Request Settings
和 Override HTTP Proxy Settings
, 其中前者用來配置Nexus 訪問遠(yuǎn)程倉庫時(shí)HTTP 請(qǐng)求的參數(shù),后者用來配置HTTP 代理。
3.5 創(chuàng)建 Nexus 倉庫組
要?jiǎng)?chuàng)建一個(gè)倉庫組,首先單擊界面左邊導(dǎo)航欄中的Repositories
鏈接,在右邊的面板中,選擇Add
, 接著在下拉菜單中選擇 Repository Group
, 就會(huì)看到圖所示的配置界面。
配置中的 ID、Name 等信息這里不再贅述。需要注意的是,倉庫組沒有 Release 和 Snapshot 的區(qū)別,這不同于宿主倉庫和代理倉庫。在配置界面中,用戶可以非常直觀地選擇 Nexus 中倉庫,將其聚合成一個(gè)虛擬的倉庫組。注意,倉庫組所包含的倉庫的順序決定了倉庫組遍歷其所含倉庫的次序,因此最好將常用的倉庫放在前面,當(dāng)用戶從倉庫組下載構(gòu)件的時(shí)候,就能夠盡快地訪問到包含構(gòu)件的倉庫。
4?? Nexus 的索引與構(gòu)件搜索
既然 Nexus 能夠維護(hù)宿主倉庫并代理緩存遠(yuǎn)程倉庫(如 Maven 中央庫), 那么一個(gè)簡(jiǎn)單的需求就自然浮現(xiàn)出來了,這就是搜索。 Maven 中央庫有幾十萬構(gòu)件供用戶使用,但有時(shí) 我們往往僅僅知道某個(gè)關(guān)鍵字,如 Ehcache, 而不知道其確切的 Maven 坐標(biāo)。 Nexus 通過維護(hù)倉庫的索引來提供搜索功能,能在很大程度上方便 Maven 用戶定位構(gòu)件坐標(biāo)。
前面文章中介紹過了Sonatype提供的在線免費(fèi)搜索服務(wù),其實(shí)用戶可以很方便地自己維護(hù)一個(gè)Nexus 實(shí)例,并提供搜索服務(wù)。
為了能夠搜索Maven 中央庫,首先需要設(shè)置 Nexus 中的 Maven Central 代理倉庫下載遠(yuǎn) 程索引,如圖所示。需要注意的是,默認(rèn)這個(gè)配置的值是關(guān)閉的。此外,由于中央庫的內(nèi)容比較多,因此其索引文件比較大, Nexus 下載該文件也需要比較長(zhǎng)的時(shí)間,需要耐心等待。
可以想象到, Nexus 在后臺(tái)運(yùn)行了一個(gè)任務(wù)來下載中央倉庫的索引,幸運(yùn)的是,用戶可 以通過界面直接觀察這一任務(wù)的狀態(tài)。單擊界面左邊導(dǎo)航欄中的Scheduled Tasks
鏈接后, 用戶就能在界面的右邊看到系統(tǒng)的調(diào)度任務(wù),如果 Nexus 正在下載中央倉庫的索引,用戶就能看到一個(gè)任務(wù),其狀態(tài)為RUNNING。 在索引下載完畢之后,該任務(wù)就會(huì)消失。
有了索引,用戶即可搜索Maven 構(gòu)件了。 Nexus 界面左邊導(dǎo)航欄有一個(gè)快捷搜索框,在 其中輸入關(guān)鍵字后,單擊搜索按鈕就能快速得到搜索結(jié)果。使用關(guān)鍵字進(jìn)行搜索,可以得到該關(guān)鍵字相關(guān)的結(jié)果,結(jié)果中的每一行都表示了一類構(gòu)件,信息包括Groupld、Artifactld、最新版本以及最新版本的相關(guān)文件下載等。單擊其中的某一行,界面的下端會(huì)浮出一個(gè)更具體的構(gòu)件信息面板。
該面板除了顯示構(gòu)件的坐標(biāo),還包含了一段 XML 依賴聲明,用戶可以直接復(fù)制粘貼到 項(xiàng)目的 POM 中。此外,用戶還能從該面板獲知構(gòu)件在倉庫中的相對(duì)位置。單擊 Artifact Information
還能看到文件具體的大小、更新時(shí)間、 SHA1 和 MD5 校驗(yàn)和以及下載鏈接。除了簡(jiǎn)單的關(guān)鍵字搜索, Nexus 還提供了GAV 搜索、類名搜索和校驗(yàn)和搜索等功能,用戶可以單擊搜索頁面左上角的下拉菜單選擇高級(jí)搜索功能:
- GAV 搜索 (GAV Search) 允許用戶通過設(shè)置 Groupld 、Artifactld 和 Version 等信息來進(jìn)行更有針對(duì)性的搜索。
- 類名搜索 (Classname Search) 允許用戶搜索包含某個(gè)Java 類的構(gòu)件。
- 校驗(yàn)和搜索 (Checksum Search) 允許用戶直接使用構(gòu)件的校驗(yàn)和來搜索該構(gòu)件。
當(dāng)然,用戶也可以自己手動(dòng)輸入 Groupld、Artifactld 等信息來進(jìn)行GAV 搜索。有了中央倉庫的索引,用戶不僅能夠搜索構(gòu)件,還能夠直接瀏覽中央倉庫的內(nèi)容。這便是Nexus 的索引瀏覽功能。在Repositories
頁面中,選擇 Browse Index
選項(xiàng)卡,就能看到中央倉庫內(nèi)容的樹形結(jié)構(gòu)。
以上的搜索及瀏覽功能都是基于Nexus 索引而實(shí)現(xiàn)的,確切地應(yīng)該稱之為 nexus-indexer
。Nexus 能夠遍歷一個(gè) Maven 倉庫所有的內(nèi)容,搜集它們的坐標(biāo)、校驗(yàn)和及所含的Java 類信息,然后以 nexus-indexer
的形式保存起來。中央倉庫維護(hù)了這樣的一個(gè)nexus-indexer
, 因此本地的 Nexus 下載到這個(gè)索引之后,就能在此基礎(chǔ)上提供搜索和瀏覽等服務(wù)。需要注意的是,不是任何一個(gè)公共倉庫都提供 nexus-indexer
, 對(duì)于那些不提供索引的倉庫來說,我們就無法對(duì)其進(jìn)行搜索。
除了下載使用遠(yuǎn)程倉庫的索引,我們也能為宿主倉庫和代理倉庫建立索引。只需要在倉庫上右擊,從彈出的快捷菜單中選擇 ReIndex
即可。待索引編纂任務(wù)完成之后,就能搜索該倉庫所包含的構(gòu)件。
對(duì)于宿主倉庫來說, ReIndex
任務(wù)會(huì)掃描該倉庫包含的所有構(gòu)件建立索引。對(duì)于代理倉 庫來說, Relndex
任務(wù)會(huì)掃描所有緩存的構(gòu)件建立索引,如果遠(yuǎn)程倉庫也有索引,則下載后與本地的索引合并。對(duì)于倉庫組來說, Relndex
任務(wù)會(huì)合并其包含的所有倉庫的索引。
5?? 配置 Maven從 Nexus下載構(gòu)件
前面文章中我們已經(jīng)詳細(xì)介紹了如何在 POM 中為Maven 配置倉庫和插件倉庫。例如,當(dāng)需要為項(xiàng)目添加 Nexus私服上的 public倉庫時(shí),可以按以下代碼所示配置。
<project><repositories><repository><id>nexus</id><name>Nexus</name><url>http://localhost:8081/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>nexus</id><name>Nexus</name><url>http://localhost:8081/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></pluginRepository></pluginRepositories>
</project>
這樣的配置只對(duì)當(dāng)前Maven項(xiàng)目有效,在實(shí)際應(yīng)用中,我們往往想要通過一次配置就能讓本機(jī)所有的 Maven項(xiàng)目都使用自己的Maven私服。這個(gè)時(shí)候可能會(huì)想到settings.xml
文件,該文件中的配置對(duì)所有本機(jī)bMaven項(xiàng)目有效,但是settings.xml
并不支持直接配置repositories
和 pluginRepositories
。所幸Maven還提供了 Profile機(jī)制,能讓用戶將倉庫配置放到setting.xml
中的 Profile中,如代碼所示。
<settings><profiles><profile><id>nexus</id><repositories><repository><id>nexus</id><name>Nexus</name><url>http://localhost:8081/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>nexus</id><name>Nexus</name><url>http://localhost:8081/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></anapshots></pluginRepository></pluginRepositories></profile></profiles><activeProfiles><activeProfile>nexus</activeProfile></activeProfiles>
</settings>
該配置中使用了一個(gè)id為 nexus的 profile, 這個(gè) profile包含了相關(guān)的倉庫配置,同時(shí)配
置中又使用 activeProfile元素將 nexus這個(gè) profile激活,這樣當(dāng)執(zhí)行Maven構(gòu)建的時(shí)候,激活的profile會(huì)將倉庫配置應(yīng)用到項(xiàng)目中去。關(guān)于Maven Profile, 后面還會(huì)有專門的文章進(jìn)一步介紹。
上面代碼中的配置已經(jīng)能讓本機(jī)所有的Maven項(xiàng)目從Nexus私服下載構(gòu)件。細(xì)心的朋友可能會(huì)注意到,Maven除了從Nexus下載構(gòu)件之外,還會(huì)不時(shí)地訪問中央倉庫 central, 我們希望的是所有Maven下載請(qǐng)求都僅僅通過Nexus, 以全面發(fā)揮私服的作用。這個(gè)時(shí)候就需要借助于前面提到過的 Maven鏡像配置了。可以創(chuàng)建一個(gè)匹配任何倉庫的鏡像,鏡像的地址為私服,這樣,Maven對(duì)任何倉庫的構(gòu)件下載請(qǐng)求都會(huì)轉(zhuǎn)到私服中。具體配置見代碼:
<settings><mirrors><mirror><id>nexus</id><mirrorof>*</mirrorof><url>http://localhost:8081/nexus/content/groups/public</url></mirror></mirrors><profiles><profile><id>nexus</id><repositories><repository><id>central</id><url>http://central</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>central</id><url>http://central</url><release><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></pluginRepository></pluginRepositories></profile></profiles><activeProfiles><activeProfile>nexus</activeProfile></activeProfiles>
</settings>
關(guān)于鏡像、profile及profile激活的配置不再贅述,這里需要解釋的是倉庫及插件倉庫配置,它們的 id都為 central,也就是說,覆蓋了超級(jí)POM中央倉庫的配置,它們的 url已無關(guān)緊要,因?yàn)樗姓?qǐng)求都會(huì)通過鏡像訪問私服地址。配置倉庫及插件倉庫的主要目的是開啟對(duì)快照版本下載的支持,當(dāng)Maven需要下載發(fā)布版或快照版構(gòu)件的時(shí)候,它首先檢查central,看該類型的構(gòu)件是否支持,得到正面的回答之后,再根據(jù)鏡像匹配規(guī)則轉(zhuǎn)而訪問私服倉庫地址。
6?? 部署構(gòu)件至 Nexus
如果只為代理外部公共倉庫,那么Nexus的代理倉庫就已經(jīng)能夠完全滿足需要了。對(duì)于另一類Nexus倉庫——宿主倉庫來說,它們的主要作用是儲(chǔ)存組織內(nèi)部的,或者一些無法從公共倉庫中獲得的第三方構(gòu)件,供大家下載使用。用戶可以配置Maven自動(dòng)部署構(gòu)件至Nexus的宿主倉庫,也可以通過界面手動(dòng)上傳構(gòu)件。
6.1 使用 Maven 部署構(gòu)件至 Nexus
日常開發(fā)生成的快照版本構(gòu)件可以直接部署到 Nexus中策略為 Snapshot的宿主倉庫中,項(xiàng)目正式發(fā)布的構(gòu)件則應(yīng)該部署到 Nexus中策略為 Release的宿主倉庫中。下面代碼列出了一段典型的配置。
<project><distributionManagement><repository><id>nexusreleases</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的倉庫對(duì)于置名用戶是只讀的。為了能夠部署構(gòu)件,還需要在 settings.xml中配
置認(rèn)證信息,如代碼所示。
<settings><servers><server><id>nexus-releases</id><username>admin</username><password>*****</password></server><server><id>nexus-snapshots</id><username>admin</username><password>*****</password></server></servers>
</settings>
6.2 手動(dòng)部署第三方構(gòu)件至 Nexus
某些Java Jar文件(如Oracle)的JDBC驅(qū)動(dòng),由于許可證的因素,它們無法公開地放在公共倉庫中。此外,還有大量的小型開源項(xiàng)目,它們沒有把自己的構(gòu)件分發(fā)到中央倉庫中,也沒有維護(hù)自己的倉庫,因此也無法從公共倉庫獲得。這個(gè)時(shí)候用戶就需要將這類構(gòu)件手動(dòng)下載到本地,然后通過Nexus的界面上傳到私服中。
要上傳第三方構(gòu)件,首先選擇一個(gè)宿主倉庫如 3rd party, 然后在頁面的下方選擇Artifact Upload
選項(xiàng)卡。在上傳構(gòu)件的時(shí)候,Nexus要求用戶確定其Maven坐標(biāo),如果該構(gòu)件是通過Maven構(gòu)建的,那么可以在 GAV Definition
下拉列表中選擇 From POM
, 否則就選GAV Parameters
。用戶需要為該構(gòu)件定義一個(gè)Maven坐標(biāo),定義好坐標(biāo)之后,單擊Select Artifact(s) to Upload
按扭從本機(jī)選擇要上傳的構(gòu)件,然后單擊Add Artifact
按鈕將其加入到上傳列表中。Nexus允許用戶一次上傳一個(gè)主構(gòu)件和多個(gè)附屬構(gòu)件(即Classifier)。最后,單擊頁面最下方的Upload Artifact(s)
按鈕將構(gòu)件上傳到倉庫中。
7?? Nexus 的權(quán)限管理
在組織中使用Nexus的時(shí)候往往會(huì)有一些安全性需求,例如希望只有管理員才能配置 Nexus, 只有某些團(tuán)隊(duì)成員才能部署構(gòu)件,或者更細(xì)一些的要求,例如每個(gè)項(xiàng)目都有自己的 Nexus宿主倉庫,且只能部署項(xiàng)目構(gòu)件至該倉庫中。 Nexus 提供了全面的權(quán)限控制特性,能 讓用戶自由地根據(jù)需要配置 Nexus用戶、角色、權(quán)限等。
7.1 Nexus 的訪問控制模型
Nexus是基于權(quán)限 (Privilege) 做訪問控制的,服務(wù)器的每一個(gè)資源都有相應(yīng)的權(quán)限來控制,因此用戶執(zhí)行特定的操作時(shí)就必須擁有必要的權(quán)限。管理員必須以角色 (Role) 的 方式將權(quán)限賦予Nexus用戶。例如要訪問 Nexus 界面,就必須擁有 Status- (read) 這個(gè)權(quán)限,而Nexus默認(rèn)配置的角色UI:Basic UI Privileges 就包含了這個(gè)權(quán)限,再將這個(gè)角色分配給某個(gè)用戶,這個(gè)用戶就能訪問Nexus界面了。
用戶可以被賦予一個(gè)或者多個(gè)角色,角色可以包含一個(gè)或者多個(gè)權(quán)限,角色還可以包含一個(gè)或者多個(gè)其他角色。
Nexus預(yù)定義了三個(gè)用戶,以admin登錄后,單擊頁面左邊導(dǎo)航欄中的User鏈接,就能看到所有已定義用戶的列表。
這三個(gè)用戶對(duì)應(yīng)了三個(gè)權(quán)限級(jí)別 :
admin
: 該用戶擁有對(duì)Nexus服務(wù)的完全控制,默認(rèn)密碼為admin123。deployment
: 該用戶能夠訪問Nexus, 瀏覽倉庫內(nèi)容,搜索,并且上傳部署構(gòu)件,但是無法對(duì)Nexus進(jìn)行任何配置,默認(rèn)密碼為deployment123。anonymous
: 該用戶對(duì)應(yīng)了所有未登錄的匿名用戶,它們可以瀏覽倉庫并進(jìn)行搜索。
在Users頁面中,管理員還可以添加用戶。單擊上方的Add按鈕,選擇Nexus User,然后在用戶配置面板中配置要添加用戶的 ID、名稱、Email、狀態(tài)、密碼以及包含的角色,最后單擊Save按鈕即可。
可以單擊任何一個(gè)用戶,然后選擇頁面下方的Role Tree選項(xiàng)卡,以樹形結(jié)構(gòu)詳細(xì)地查看該用戶所包含的角色以及進(jìn)一步的權(quán)限。
理解各個(gè)角色的意義對(duì)于權(quán)限管理至關(guān)重要。Nexus預(yù)定義的一些常用且重要的角色
包 括 :
UI: Basic UI Privileges
: 包含了訪問Nexus界面必須的最基本的權(quán)限;UI: Repository Browser
: 包含了瀏覽倉庫頁面所需要的權(quán)限;UI: Search
: 包含了訪問快速搜索欄及搜索頁面所需要的權(quán)限;Repo: All Repositories(Read)
: 給予用戶讀取所有倉庫內(nèi)容的權(quán)限,沒有倉庫的讀權(quán)限,用戶將無法在倉庫頁面上看到實(shí)際的倉庫內(nèi)容,也無法使用Maven從倉庫下載構(gòu)件;Repo: All Repositories(Full Control)
: 給予用戶完全控制所有倉庫內(nèi)容的權(quán)限。用戶不僅可以瀏覽、下載構(gòu)件,還可以部署構(gòu)件及刪除倉庫內(nèi)容。
Nexus 包含了一個(gè)特殊的匿名用戶角色 (Nexus Anonymous Role
),默認(rèn)配置下沒有登錄 的用戶都會(huì)擁有該匿名角色的權(quán)限。這個(gè)匿名用戶角色實(shí)際包含了上述所列角色中,除Repo: All Reposiories(Full Control)
之外的所有角色所包含的權(quán)限。也就是說,匿名用戶可以訪問基本的 Nexus 界面、瀏覽倉庫內(nèi)容及搜索構(gòu)件。
除上述角色之外, Nexus 還預(yù)定義了很多其他角色,它們往往都對(duì)應(yīng)了一個(gè) Nexus 的功能。例如,UI: Logs and Config Files
包含了訪問系統(tǒng)日志文件及配置文件所需要的權(quán)限。
7.2 為項(xiàng)目分配獨(dú)立的倉庫
在組織內(nèi)部,如果所有項(xiàng)目都部署快照及發(fā)布版構(gòu)件至同樣的倉庫,就會(huì)存在潛在的沖突及安全問題,我們不想讓項(xiàng)目A 的部署影響到項(xiàng)目B, 反之亦然。解決的方法就是為每個(gè)項(xiàng)目分配獨(dú)立的倉庫,并且只將倉庫的部署、修改和刪除權(quán)限賦予該項(xiàng)目的成員,其 他用戶只能讀取、下載和搜索該倉庫的內(nèi)容。
假設(shè)項(xiàng)目名稱為 foo, 首先為該項(xiàng)目建立兩個(gè)宿主倉庫 Foo Snapshots
和 Foo Releases
, 分別用來部署快照構(gòu)件和發(fā)布構(gòu)件。具體步驟見 3.3節(jié),這里不再贅述。
有了倉庫之后,就需要?jiǎng)?chuàng)建基于倉庫的增、刪、改、查權(quán)限。在Nexus 中,這樣的權(quán)限是基于Repository Target
建立的, Repository Target
實(shí)際上是一系列正則表達(dá)式,在訪問倉庫某路徑下內(nèi)容的時(shí)候, Nexus 會(huì)將倉庫路徑與 Repository Target
的正則表達(dá)式 — —匹配, 以檢查權(quán)限是否正確。
單擊左邊導(dǎo)航欄中的Repository Targets
鏈接,選中一個(gè) Repository Target
, 在下方可以看到它包含了一個(gè)值為“.*
”的正則表達(dá)式,表示該 Repository Target
能夠匹配倉庫下的任何路徑。
下一步就是基于該Repository Target
和 Foo Releases
、Foo Snapshots
兩個(gè)倉庫建立權(quán)限。單擊頁面左邊導(dǎo)航欄中的Privileges
鏈接進(jìn)入權(quán)限頁面,然后單擊Add按鈕,選擇Repositury Target Privilege
。
選擇Foo Releases
倉庫和 All(Maven2)
, 表示創(chuàng)建匹配 Foo Releases
倉庫任何路徑的權(quán)限。單擊Save按鈕之后,就能在權(quán)限列表中看到相應(yīng)的增、刪、改、查權(quán)限。
然后,遵循同樣的步驟,為Foo Snapshots
建立增、刪、改、查權(quán)限。下一步是創(chuàng)建一個(gè)包含上述權(quán)限的角色。單擊導(dǎo)航欄中的Roles進(jìn)入角色頁面,再單擊頁面上方的Add 按鈕并選擇Nexus Role。將之前建立的權(quán)限加入到該角色中。
角色創(chuàng)建完成之后,根據(jù)需要將其分配給Foo項(xiàng)目的團(tuán)隊(duì)成員。這樣,其他團(tuán)隊(duì)的成員默認(rèn)只能讀取Foo Releases
和Foo Snapshots
的內(nèi)容,而擁有Foo Deployer
角色的用戶就可以執(zhí)行部署構(gòu)件等操作。
8?? Nexus的調(diào)度任務(wù)
Nexus提供了一系列可配置的調(diào)度任務(wù)來方便用戶管理系統(tǒng)。用戶可以設(shè)定這些任務(wù)運(yùn)行的方式,例如每天、每周、手動(dòng)等。調(diào)度任務(wù)會(huì)在適當(dāng)?shù)臅r(shí)候在后臺(tái)運(yùn)行。當(dāng)然,用戶還是能夠在界面觀察它們的狀態(tài)的。
要建立一個(gè)調(diào)度任務(wù),單擊左邊導(dǎo)航欄中的Scheduled Tasks
鏈接,然后在右邊的界面上方單擊Add按鈕,接著就能用戶可以根據(jù)自己的需要,選擇任務(wù)類型,并配置其運(yùn)行方式。
Nexus包含了以下幾種類型的調(diào)度任務(wù):
Download Indexes
: 為代理倉庫下載遠(yuǎn)程索引。Empty Trash
: 清空Nexus的回收站,一些操作(如刪除倉庫文件)實(shí)際是將文件移
到了回收站中。Evict Unused Proxied Items From Repository Caches
: 刪除代理倉庫中長(zhǎng)期未被使用的構(gòu)件緩存。Expire Repository Caches
: Nexus為代理倉庫維護(hù)了遠(yuǎn)程倉庫的信息以避免不必要的網(wǎng)絡(luò)流量,該任務(wù)清空這些信息以強(qiáng)制Nexus 去重新獲取遠(yuǎn)程倉庫的信息。Publish Indexes
: 將倉庫索引發(fā)布成可供 m2eclipse 和其他Nexus 使用的格式。Purge Nexus Timeline
: 刪除 Nexus 的時(shí)間線文件,該文件用于建立系統(tǒng)的RSS 源。Rebuild Maven Metadata Files
: 基于倉庫內(nèi)容重新創(chuàng)建倉庫元數(shù)據(jù)文件 maven-meta-data.xml, 同時(shí)重新創(chuàng)建每個(gè)文件的校驗(yàn)和md5 和 sha1。Reindex Repositories
: 為倉庫編纂索引。Remove Snapshots From Repository
: 以可配置的方式刪除倉庫的快照構(gòu)件。Synchronize Shadow Repository
: 同步虛擬倉庫的內(nèi)容(服務(wù)于Maven 1)。
9?? 其他私服軟件
Nexus 不是唯一 的Maven 私服軟件,正如本文一開始所提到的,用戶還有另外兩個(gè)選 擇,它們分別為 Apache 的 Archiva與 JFrog的 Artifactory。
Archiva 可能是歷史最長(zhǎng)的Maven 私服軟件,它早在2005年就作為 Apache Maven 的 一 個(gè)子項(xiàng)目存在,到2008年3月成為了Apache 軟件基金會(huì)的頂級(jí)項(xiàng)目。
大家可以訪問 http://archiva.apache.org
以具體了解 Archiva, 其站點(diǎn)提供了一些入門指南及郵件列表等信息。Archiva 的 下載地址為 http://archiva.apache.org/download.html
。
在 Nexus發(fā)布之前,筆者曾一度是 Artifactory
的忠實(shí)用戶,當(dāng)時(shí)它是唯一的支持從用戶 界面配置倉庫的私服。 Artifactory
的一大特點(diǎn)是使用數(shù)據(jù)庫來存儲(chǔ)倉庫內(nèi)容。讀者可以自行訪問JFrog站點(diǎn)以了解更多信息: http://www.jfog.org/products.php
。 Artifactory 目前的最新版本為2.2.5, 其下載地址為 http://www.jfrog.org/download.php
。
🌾 總結(jié)
建立并維護(hù)自己的私服是使用Maven 必不可少的一步,Maven 私服軟件有 Nexus
、Archiva
和 Artifactory
, 它們都提供了開源的版本供用戶下載。本文詳細(xì)介紹了Nexus 的安裝和使用,包括如何分辨各種類型的倉庫、如何建立倉庫索引和搜索構(gòu)件、如何使用權(quán)限管理功能、如何使用調(diào)度任務(wù)功能等。除了這些功能之外, Nexus 還有很多有趣的特性,如 RSS 源、日志瀏覽及配置等,用戶可以從友好的界面中學(xué)習(xí)使用。
除了Nexus本身,本文還詳述了如何配置Maven 從私服下載構(gòu)件,以及如何發(fā)布構(gòu)件至私服供他人使用。結(jié)合了Nexus的幫助之后,再使用Maven 時(shí)就會(huì)如虎添翼。
《【Maven教程】(七)聚合與繼承:多模塊項(xiàng)目實(shí)用特性介紹,反應(yīng)堆構(gòu)建及裁剪 ~》
《【Maven教程】(九):使用 Maven 進(jìn)行測(cè)試 ~》
