一、Maven介紹
Apache Maven是一個創新的軟體項目管理和綜合工具。
Maven提供了一個基于項目對象模型(POM)檔案的新概念來管理項目的建構,可以從一個中心資料片管理項目建構,報告和檔案。
Maven最強大的功能就是能夠自動下載下傳項目依賴庫。
Maven提供了開發人員建構一個完整的生命周期架構。開發團隊可以自動完成項目的基礎工具建設,Maven使用标準的目錄結構和預設建構生命周期。
在多個開發團隊環境時,Maven可以設定按标準在非常短的時間裡完成配置工作。由于大部分項目的設定都很簡單,并且可重複使用,Maven讓開發人員的工作更輕松,同時建立報表,檢查,建構和測試自動化設定。
Maven項目的結構和内容在一個XML檔案中聲明,pom.xml 項目對象模型(POM),這是整個Maven系統的基本單元。
Maven提供了開發人員的方式來管理:
1)Builds
2)Documentation
3)Reporting
4)Dependencies
5)SCMs
6)Releases
7)Distribution
8)mailing list
概括地說,Maven簡化和标準化項目建設過程。處理編譯,配置設定,文檔,團隊協作和其他任務的無縫連接配接。
Maven增加可重用性并負責建立相關的任務。
Maven最初設計,是以簡化Jakarta Turbine項目的建設。在幾個項目,每個項目包含了不同的Ant建構檔案。 JAR檢查到CVS。
Apache組織開發Maven可以建立多個項目,釋出項目資訊,項目部署,在幾個項目中JAR檔案提供團隊合作和幫助。
Maven主要目标是提供給開發人員:
1)項目是可重複使用,易維護,更容易了解的一個綜合模型。
2)插件或互動的工具,這種聲明性的模式。
二、私服介紹
私服是指私有伺服器,是架設在區域網路的一種特殊的遠端倉庫,目的是代理遠端倉庫及部署第三方建構。有了私服之後,當 Maven 需要下載下傳構件時,直接請求私服,私服上存在則下載下傳到本地倉庫;否則,私服請求外部的遠端倉庫,将構件下載下傳到私服,再提供給本地倉庫下載下傳。

三、Nexus介紹
Nexus是一個強大的Maven倉庫管理器,它極大地簡化了本地内部倉庫的維護和外部倉庫的通路。
如果使用了公共的Maven倉庫伺服器,可以從Maven中央倉庫下載下傳所需要的構件(Artifact),但這通常不是一個好的做法。
正常做法是在本地架設一個Maven倉庫伺服器,即利用Nexus私服可以隻在一個地方就能夠完全控制通路和部署在你所維護倉庫中的每個Artifact。
Nexus在代理遠端倉庫的同時維護本地倉庫,以降低中央倉庫的負荷,節省外網帶寬和時間,Nexus私服就可以滿足這樣的需要。
Nexus是一套“開箱即用”的系統不需要資料庫,它使用檔案系統加Lucene來組織資料。
Nexus使用ExtJS來開發界面,利用Restlet來提供完整的REST APIs,通過m2eclipse與Eclipse內建使用。
Nexus支援WebDAV與LDAP安全身份認證。
Nexus還提供了強大的倉庫管理功能,構件搜尋功能,它基于REST,友好的UI是一個extjs的REST用戶端,它占用較少的記憶體,基于簡單檔案系統而非資料庫。
為什麼要建構Nexus私服?
如果沒有Nexus私服,我們所需的所有構件都需要通過maven的中央倉庫和第三方的Maven倉庫下載下傳到本地,而一個團隊中的所有人都重複的從maven倉庫下載下傳構件無疑加大了倉庫的負載和浪費了外網帶寬,如果網速慢的話,還會影響項目的程序。很多情況下項目的開發都是在内網進行的,連接配接不到maven倉庫怎麼辦呢?開發的公共構件怎麼讓其它項目使用?這個時候我們不得不為自己的團隊搭建屬于自己的maven私服,這樣既節省了網絡帶寬也會加速項目搭建的程序,當然前提條件就是你的私服中擁有項目所需的所有構件。
總之,在本地建構nexus私服的好處有:
1)加速建構;
2)節省帶寬;
3)節省中央maven倉庫的帶寬;
4)穩定(應付一旦中央伺服器出問題的情況);
5)控制和審計;
6)能夠部署第三方構件;
7)可以建立本地内部倉庫;
8)可以建立公共倉庫
這些優點使得Nexus日趨成為最流行的Maven倉庫管理器。
四、Maven的安裝
下載下傳位址:http://maven.apache.org/download.cgi
提前在伺服器上安裝jdk環境(參考:Centos中yum方式安裝java)
[root@master-node ~]# cd /usr/local/src/
[root@master-node src]# wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@master-node src]# tar -zvxf apache-maven-3.3.9-bin.tar.gz
[root@master-node src]# mv apache-maven-3.3.9 /usr/local/maven
接着配置系統環境變量,在/etc/profile檔案底部添加如下内容:
[root@master-node src]# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
[root@master-node src]# vim /etc/profile
.....
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk //java的環境變量設定
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/usr/local/maven //maven的環境變量設定
export PATH=$PATH:$MAVEN_HOME/bin
[root@master-node src]# source /etc/profile
最後驗證是否安裝成功,出現如下資訊,說明安裝成功
[root@master-node src]# mvn --version # 最好按照java jdk
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-327.el7.x86_64", arch: "amd64", family: "unix"
五、Nexus安裝
Nexus的安裝有兩種實作方式:
1)war包安裝方式
下載下傳位址:https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.2-01.war
直接将war包放在tomcat的根目錄下,啟動tomcat就可以用了
2)源碼安裝方式(之前在用的是2.14.4版本,這裡是新版本)
下載下傳位址:https://www.sonatype.com/download-oss-sonatype (雲盤下載下傳:http://pan.baidu.com/s/1miKFm5a)
[root@master-node src]# wget https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.2.0-01-unix.tar.gz
[root@master-node src]# tar -zvxf nexus-3.2.0-01-unix.tar.gz
[root@master-node src]# mv nexus-3.2.0-01 /usr/local/nexus
啟動nexus(預設端口是8081)
[root@master-node src]# /usr/local/nexus/bin/nexus
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
Usage: /usr/local/nexus/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload}
[root@master-node src]# /usr/local/nexus/bin/nexus start
WARNING: Detected execution as "root" user. This is NOT recommended!
Starting nexus
上面在啟動過程中出現告警:不推薦使用root使用者啟動。這個告警不影響nexus的正常通路和使用。
去掉上面WARNING的辦法:
......
export RUN_AS_USER=root
[root@master-node src]# lsof -i:8081 //nexus服務啟動成功後,需要稍等一段時間,8081端口才起來
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1486 root 859u IPv4 23504303 0t0 TCP *:tproxy (LISTEN)
在部署機上的iptables裡打開8081端口
[root@master-node src]# vim /etc/sysconfig/iptables
....
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
[root@master-node src]# /etc/init.d/iptables restart
通路nexus,即http://localhost:8081 (如果出現404,就通路http://localhost:8081/nexus)
出現上述頁面,說明配置nexus成功!
點選右上角“Log in”,
輸入預設使用者名(admin)和預設密碼(admin123)登入
可以點選上面的“設定”圖示,在“設定”裡可以添加使用者、角色,對接LDAP等的設定,如下:
六、Nexus說明
1.component name的一些說明:
1)maven-central:maven中央庫,預設從https://repo1.maven.org/maven2/拉取jar
2)maven-releases:私庫發行版jar
3)maven-snapshots:私庫快照(調試版本)jar
4)maven-public:倉庫分組,把上面三個倉庫組合在一起對外提供服務,在本地maven基礎配置settings.xml中使用。
2.Nexus預設的倉庫類型有以下四種:
1)group(倉庫組類型):又叫組倉庫,用于友善開發人員自己設定的倉庫;
2)hosted(宿主類型):内部項目的釋出倉庫(内部開發人員,釋出上去存放的倉庫);
3)proxy(代理類型):從遠端中央倉庫中尋找資料的倉庫(可以點選對應的倉庫的Configuration頁簽下Remote Storage Location屬性的值即被代理的遠端倉庫的路徑);
4)virtual(虛拟類型):虛拟倉庫(這個基本用不到,重點關注上面三個倉庫的使用);
3.Policy(政策):表示該倉庫為釋出(Release)版本倉庫還是快照(Snapshot)版本倉庫;
4.Public Repositories下的倉庫
1)3rd party: 無法從公共倉庫獲得的第三方釋出版本的構件倉庫,即第三方依賴的倉庫,這個資料通常是由内部人員自行下載下傳之後釋出上去;
2)Apache Snapshots: 用了代理ApacheMaven倉庫快照版本的構件倉庫
3)Central: 用來代理maven中央倉庫中釋出版本構件的倉庫
4)Central M1 shadow: 用于提供中央倉庫中M1格式的釋出版本的構件鏡像倉庫
5)Codehaus Snapshots: 用來代理CodehausMaven 倉庫的快照版本構件的倉庫
6)Releases: 内部的子產品中release子產品的釋出倉庫,用來部署管理内部的釋出版本構件的宿主類型倉庫;release是釋出版本;
7)Snapshots:釋出内部的SNAPSHOT子產品的倉庫,用來部署管理内部的快照版本構件的宿主類型倉庫;snapshots是快照版本,也就是不穩定版本
是以自定義建構的倉庫組代理倉庫的順序為:Releases,Snapshots,3rd party,Central。也可以使用oschina放到Central前面,下載下傳包會更快。
5.Nexus預設的端口是8081,可以在etc/nexus-default.properties配置中修改。
6.Nexus預設的使用者名密碼是admin/admin123
7.當遇到奇怪問題時,重新開機nexus,重新開機後web界面要1分鐘左右後才能通路。
8.Nexus的工作目錄是sonatype-work(路徑一般在nexus同級目錄下)
[root@master-node local]# pwd
/usr/local
[root@master-node local]# ls nexus/
bin deploy etc lib LICENSE.txt NOTICE.txt public system
[root@master-node local]# ls sonatype-work/
nexus3
[root@master-node local]# ls sonatype-work/nexus3/
backup blobs cache db elasticsearch etc generated-bundles health-check instances keystores lock log orient port tmp
Nexus倉庫分類的概念
1)Maven可直接從宿主倉庫下載下傳構件,也可以從代理倉庫下載下傳構件,而代理倉庫間接的從遠端倉庫下載下傳并緩存構件
2)為了友善,Maven可以從倉庫組下載下傳構件,而倉庫組并沒有時間的内容(下圖中用虛線表示,它會轉向包含的宿主倉庫或者代理倉庫獲得實際構件的内容).
Nexus的web界面功能介紹
1.Browse Server Content
1.1 Search
這個就是類似Maven倉庫上的搜尋功能,就是從私服上查找是否有哪些包。
注意:
1)在Search這級是支援模糊搜尋的,如圖所示:
1)Assets
這是能看到所有的資源,包含Jar,已經對Jar的一些描述資訊。
2)Components
這裡隻能看到Jar包。
2.Server Adminstration And configuration
看到這個選項的前提是要進行登入的,如上面已經介紹登陸方法,右上角點選“Sign In”的登入按鈕,輸入admin/admin123,登入成功之後,即可看到此功能,如圖所示:
2.1 Blob Stores
檔案存儲的地方,建立一個目錄的話,對應檔案系統的一個目錄,如圖所示:
1)Proxy
這裡就是代理的意思,代理中央Maven倉庫,當PC通路中央庫的時候,先通過Proxy下載下傳到Nexus倉庫,然後再從Nexus倉庫下載下傳到PC本地。
這樣的優勢隻要其中一個人從中央庫下來了,以後大家都是從Nexus私服上進行下來,私服一般部署在内網,這樣大大節約的寬帶。
建立Proxy的具體步驟
1--點選“Create Repositories”按鈕
3--填寫詳細資訊
Name:就是為代理起個名字
Remote Storage: 代理的位址,Maven的位址為: https://repo1.maven.org/maven2/
Blob Store: 選擇代理下載下傳包的存放路徑
2)Hosted
Hosted是主控端的意思,就是怎麼把第三方的Jar放到私服上。
Hosted有三種方式,Releases、SNAPSHOT、Mixed
Releases: 一般是已經釋出的Jar包
Snapshot: 未釋出的版本
Mixed:混合的
Hosted的建立和Proxy是一緻的,具體步驟和上面基本一緻。如下:
注意事項:
Deployment Pollcy: 需要把政策改成“Allow redeploy”。
3)Group
能把兩個倉庫合成一個倉庫來使用,目前沒使用過,是以沒做詳細的研究。
2.3 Security
這裡主要是使用者、角色、權限的配置(上面已經提到了在這裡添加使用者和角色等)
2.4 Support
包含日志及資料分析。
2.5 System
主要是郵件伺服器,排程的設定地方
這部分主要講怎麼和Maven做內建,內建的方式主要分以下種情況:代理中央倉庫、Snapshot包的管理、Release包的管理、第三方Jar上傳到Nexus上。
代理中央倉庫
隻要在PMO檔案中配置私服的位址(比如http://192.168.1.14:8081)即可,配置如下:
<repositories>
<repository>
<id>maven-central</id>
<name>maven-central</name>
<url>http://192.168.1.14:8081/repository/maven-central/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
Snapshot包的管理
1)修改Maven的settings.xml檔案,加入認證機制
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>admin123</password>
</server>
2)修改工程的Pom檔案
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>Nexus Snapshot</name>
<url>http://192.168.1.14:8081/repository/maven-snapshots/</url>
</snapshotRepository>
<site>
<id>nexus</id>
<name>Nexus Sites</name>
<url>dav:http://192.168.1.14:8081/repository/maven-snapshots/</url>
</site>
</distributionManagement>
注意事項:
上面修改的Pom檔案如截圖中的名字要跟/usr/local/maven/conf/settings.xml檔案中的名字一定要對應上。
3)上傳到Nexus上
1--項目編譯成的jar是Snapshot(POM檔案的頭部)
<groupId>com.woasis</groupId>
<artifactId>test-nexus</artifactId>
<version>1.0.0-<span style="color: #ff0000;">SHAPSHOT</span></version>
<packaging>jar</packaging>
2--使用mvn deploy指令運作即可(運作結果在此略過)
3--因為Snapshot是快照版本,預設他每次會把Jar加一個時間戳,做為曆史備份版本。
Releases包的管理
1)與Snapshot大同小異,隻是上傳到私服上的Jar包不會自動帶時間戳
2)與Snapshot配置不同的地方,就是工程的PMO檔案,加入repository配置
<distributionManagement>
<repository>
<id>nexus</id>
<name>Nexus Snapshot</name>
<url>http://192.168.1.14:8081/repository/maven-releases/</url>
</repository>
3)打包的時候需要把Snapshot去掉
<groupId>com.woasis</groupId>
<artifactId>test-nexus</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
第三方Jar上傳到Nexus
[root@master-node src]# mvn deploy:deploy-file -DgroupId=org.jasig.cas.client -DartifactId=cas-client-core -Dversion=3.1.3 -Dpackag
-DrepositoryId=nexus 對應的就是Maven中settings.xml的認證配的名字。
七、Nexus庫被删除的恢複方法
在整理Maven私服的時候,不小心把Release庫删掉了。瞬間冒出冷汗來了!腦子裡閃過第一個辦法就是看是否有資源回收筒,恰好在Nexus UI中看到了一個叫Trash...的功能。可是我點選後發現隻有Empty Trash的功能,這要按下去還得了啊。
最後在Sonatype Nexus官方搜尋到一篇文章,原文如下:
When you delete a repository from the Nexus UI, nexus will remove the repository from any groups it belongs too and move the repository contents to
it's trash folder. Sometimes you will want to restore this repository back into service.
To restore a deleted repository with id of 'releases':
1. mv sonatype-work/nexus/trash/releases sonatype-work/storage so that you end up with sonatype-work/storage/releases
2. Recreate the repository with the same repository id 'releases' using the repositories tab user interface.
3. Add the repository to any groups that it was in before.
The act of creating the repository in the UI will force a reindex of the previous repository storage contents.
幸好!找到了被删除檔案恢複的辦法。最後按照官方所提供的辦法成功地恢複了被删Release庫下所有的資料。操作步驟如下:
1)首先找到sonatype-work/nexus/trash 下找到你删除的庫,并儲存到其他地方;
2)然後通過nexus控制台點選Add,選擇Hosted Repository,然後輸入被删除的Repository資訊;
3)把剛才儲存的庫檔案copy到指定的sonatype-work/nexus/storage/[releases]下即可;
4)點選清單中的Public Repositories,然後在下方的Configuration标簽下将Releases添加到Ordered Group Repositories中;
5)最後Save儲存就可以了。
*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************