倉庫管理軟體:
私服不是maven的核心概念,它僅僅是一種衍生出來的特殊的maven倉庫
有三種專門的maven倉庫管理軟體可以用來幫助大家建立私服:
apache基金會的archiva、jfrog的artifacotory和sonatype的nexus,archiva是開源的,artifacotory和nexus的核心也是開源的
nexus分為開源版和專業版,開源版本基本gplv3許可證,其特性足以滿足大部分maven使用者的需要,特性如下:
較小的記憶體占用(最少僅為28mb)
基于extjs的友好界面
基于restlet的完全rest api
支援代理倉庫、宿主倉庫和倉庫組
基于檔案系統、不需要資料庫
支援倉庫索引和搜尋
支援從界面上傳maven構件
細粒度的安全控制
nexus專業版本是需要付費購買的,對開源版本多如下特性:
一些專業安全控制
釋出流程控制等需要的特性
安裝nexus
nexus是典型的javaweb應用,它有兩種安裝包:包含jetty容器的bundle包,不包含web容器的war包
解壓後直接運作即可
解決壓包含如下兩個目錄:
nexus-webapp-xxx:該目錄包含了nexus運作所需要的檔案,如啟動腳本、依賴jar包等
sonatype-work:該目錄包含nexus生成的配置檔案、日志檔案、倉庫檔案等
其中,第一個目錄是運作nexus所必需的,而且所有相同版本的nexus執行個體所包含的該目錄内容都是一樣的。
第二個目錄不是必須的,是在運作的時候動态建立的
是以需要備份nexus的時候,預設備份sonatype-work目錄就可以。
在linux下面安裝
warning - not recommended to run as root
****************************************
if you insist running as root, then set the environment variable run_as_user=root before running this script
在172.168.27.70伺服器上操作
root使用者操作(建立maven使用者并賦權限)
groupadd -g 1000 maven
useradd -d /opt/maven/ -g 1000 maven
chown -r maven:maven /opt/maven
passwd maven
su - maven
上傳至/opt/maven目錄
unzip nexus-2.3.0-04-bundle.zip
ln -s nexus-2.3.0-04 nexus
cd nexus/bin
./nexus start
設定環境變量
vi .bashrc
增加如下内容:
export nexus_home=/opt/maven/nexus-2.3.0-04
export path=$path:$nexus_home/bin
即可在任何目錄運作nexus指令,如
nexus start
usage: /opt/maven/nexus-2.3.0-04/bin/nexus { console | start | stop | restart | status | dump }
用admin賬号登入nexus(建議采用firefox登入,展示效果較好,在其他浏覽器相容器不好)
admin/admin123
deployment/deployment123
添加如下遠端倉庫:
<a href="http://repository.jboss.org/maven2/">http://repository.jboss.org/maven2/</a> <a href="https://repository.sonatype.org/content/groups/forge/">https://repository.sonatype.org/content/groups/forge/</a> alibaba <a href="http://code.alibabatech.com/mvn/releases/">http://code.alibabatech.com/mvn/releases</a> cloudera <a href="https://repository.cloudera.com/artifactory/cloudera-repos">https://repository.cloudera.com/artifactory/cloudera-repos</a> <a href="http://mvnrepo.code.taobao.org/nexus/content/repositories/releases/">http://mvnrepo.code.taobao.org/nexus/content/repositories/releases/</a> <a href="http://172.168.27.70:8081/nexus/index.html#welcome">http://172.168.27.70:8081/nexus/index.html#welcome</a>
配置時勾選:download remote indexes,這樣nexus自動啟動定時任務scheduled tasks下載下傳索引
預設central是沒有勾選download remote indexes,可以修改central的配置,下載下傳中央倉庫的索引
并在倉庫組 public repositories中按以下順序增加以上4個遠端倉庫
sonatype forge、apache releases、jboss releases、java net
登入nexus
nexus的預設管理者使用者名和密碼為admin/catt2013
nexus的倉庫和倉庫組
倉庫有4種類型
group(倉庫組)、hosted(宿主)、proxy(代理)、virtual(虛拟)
虛拟類型倉庫的作用實際上是動态地将倉庫内容格式轉換,即也是為了服務maven1格式
nexus内置的倉庫
maven central: 代理maven中央倉庫
releases: 一個政策為release的宿主類型倉庫,用來部署組織内部的釋出版本構件
snapshots: 一個政策為snapshot的宿主類型倉庫,用來部署組織内部的快照版本構件
3rd party: 一個政策為release的宿主類型倉庫,用來部署無法從公共倉庫獲得的第三方釋出版本構件
apache snapshots: 一個政策為snapshot的代理倉庫,用來代理apache maven倉庫的快照版本構件
codehaus snapshots: 一個政策為snapshot的代理倉庫,用來代理codehaus maven倉庫的快照版本構件
google code: 一個政策為release的代理倉庫,用來代理google code maven倉庫的釋出版本構件
java.net - maven 2:一個政策為release的代理倉庫,用來代理java.net maven倉庫的釋出版本構件
public repositories:該倉庫組将上述所有政策為release的倉庫聚合并通過一緻的位址提供服務
public snapshot repositories:該倉庫組将上述所有政策為snapshot的倉庫聚合并通過一緻的位址提供服務
倉庫分類的概念
maven可以直接從宿主倉庫下載下傳構件;也可以從代理倉庫下載下傳構件,
而代理倉庫會間接地從遠端倉庫下載下傳并緩存構件;最後,為了友善,可以從
倉庫組下載下傳構件,而倉庫組沒有實際内容(圖中用虛線表示),它會轉向其包含
的宿主倉庫或代理倉庫獲得實際構件的内容
nexus的索引與構件搜尋
nexus通過維護倉庫的索引來提供搜尋功能,能在很大程度上友善maven使用者定位構件坐标
為了能夠搜尋maven中央倉庫,首先需要設定nexus中的maven central代理倉庫下載下傳遠端索引,需要注意的是:
這上配置的值預設是關閉的,此外,由于中央倉庫的内容比較多,是以其索引檔案比較大,nexus下載下傳該檔案也需要比較
長的時間。
提供的搜尋方式如下:
關鍵字搜尋:
gav搜尋:允許使用者通過設定groupid、artifactid、version等資訊來進行更有針對性的搜尋
類名搜尋:允許使用者搜尋包含某個java類的構件
校驗搜尋:(checksum search) 允許使用者使用構件的校驗(如通過spring-core-3.0.6.release.jar.sha1的内容)進行搜尋
有了中央倉庫的索引,使用者不僅能夠搜尋構件,還能夠直接浏覽中央倉庫的内容。即nexus的索引浏覽功能。在repositories頁面中,
選擇browse index頁籤,就能看到中央倉庫内容的樹形結構。
以上的索引及浏覽功能都是基于nexus索引而實作的,确切的應該稱之為nexus-indexer
nexus能夠周遊一個maven倉庫所有的内容,搜集它們的坐标、校驗和所含的java類資訊,然後以nexus-indexer的形式儲存起來。
中央倉庫維護了這樣的一個nexus-indexer,是以本地的nexus下載下傳到這個索引之後,就能在此基礎上提供搜尋和浏覽等服務。
注意:不是任何一個公共倉庫都提供nexus-indexer,對于那些不提供索引的倉庫來說,無法對其進行搜尋。
配置maven從nexus下載下傳構件
在pom中為maven配置倉庫和插件倉庫,這樣的配置隻對目前maven項目有效,在實際應用中,需要在settings.xml中配置。
這樣對所有本機maven項目有效。但是settings。xml并不支援直接配置repositories和pluginrepositories,
可以通過profile機制進行配置
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>nexus repository</name>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
</snapshots>
</repository>
</repositories>
<pluginrepositories>
<pluginrepository>
</pluginrepository>
</pluginrepositories>
</profile>
</profiles>
<activeprofiles>
<activeprofile>nexus</activeprofile>
</activeprofiles>
這樣的配置已經能讓本機所有的maven項目從nexus私服下載下傳構件,但還會不時地通路中央倉庫central
如果希望所有maven下載下傳請求都通過nexus,以全面發揮私服的作用,就需要配置鏡像。
<mirrors>
<mirror>
<mirrorof>*</mirrorof>
</mirror>
</mirrors>
部署構件至nexus
宿主倉庫的主要作用是存儲組織内部的,或者一些無法從公共倉庫中獲得的第三方構件,供項目項目使用。
使用者可以配置maven自動部署構件至nexus的宿主倉庫,也可以通過界面手工上傳構件
使用maven部署構件至nexus(在所在項目的pom.xml中配置)
<distributionmanagement>
<repository>
<id>nexus-releases</id>
<name>nexus releases repository</name>
</repository>
<snapshotrepository>
<id>nexus-snapshots</id>
<name>nexus snapshots repository</name>
</snapshotrepository>
</distributionmanagement>
nexus的倉庫對于匿名使用者是隻讀的,為了能夠部署構件,需要在settings.xml中配置認證資訊
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
server>
<id>nexus-snapshots</id>
</servers>
手工部署第三方構件至nexus
針對由于許可證的因素無法公共地放在公共倉庫中,還有大量的小型項目,沒有把自己的構件分發到中央倉庫,可以手工下載下傳到本地,
然後通過nexus的界面上傳到私服中。
上傳第三方構件,上傳至3rd party宿主倉庫
nexus的權限管理
通路控制模型
nexus是基于權限(privilege)做通路控制的,伺服器的每一個資源都有相應的權限來控制。是以使用者執行特定的操作時就必須有必要的權限。
nexus預定義的三個使用者,這三個使用者對應了三個權限級别:
admin/admin123:擁有對nexus服務的完全控制
deployment/deployment123:能夠通路nexus,浏覽倉庫内容、搜尋、并且上傳部署構件,但無法對nexus進行任何配置
anonymous:對應了所有未登入的匿名使用者,可以浏覽倉庫并進行搜尋。
為項目配置設定獨立的倉庫
為每個項目配置設定獨立的倉庫,并且隻将倉庫的部署、修改、和删除權限賦予該項目成員,其他使用者隻能讀取、下載下傳和搜尋該倉庫的内容。
有了倉庫之後,就需要建立基于倉庫的增、删、改、查權限,在nexus中,這樣的權限是基于repository target建立的,
repository target實際上是一系清單達式,在通路倉庫某路徑下面的内容的時候,nexus會将倉庫路徑與repository target的
正規表達式一一比對,以檢查權限是否正确。
先建立repository target,然後根據repository target建立對應的privileges, 建立包含如上權限的角色,
根據需要将其配置設定給項目的團隊成員。
nexus的排程任務
nexus提供了一系列可配置的排程任務來友善使用者管理系統。