一、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 ~]# cd /usr/local/src/
[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!
WARNING: ************************************************************
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: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
上面在啟動過程中出現告警:不推薦使用root用戶啟動。這個告警不影響nexus的正常訪問和使用。
去掉上面WARNING的辦法:
[root@master-node src]# vim /etc/profile
......
export RUN_AS_USER=root
[root@master-node src]# source /etc/profile
[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的系統信息
六、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這級是支持模糊搜索的,如圖所示:
2)如果進入具體的目錄,好像不支持模糊搜索,如圖所示:
1.2 Browse
1)Assets
這是能看到所有的資源,包含Jar,已經對Jar的一些描述信息。
2)Components
這里只能看到Jar包。
2.Server Adminstration And configuration
看到這個選項的前提是要進行登錄的,如上面已經介紹登陸方法,右上角點擊“Sign In”的登錄按鈕,輸入admin/admin123,登錄成功之后,即可看到此功能,如圖所示:
2.1 Blob Stores
文件存儲的地方,創建一個目錄的話,對應文件系統的一個目錄,如圖所示:
2.2 Repositories
1)Proxy
這里就是代理的意思,代理中央Maven倉庫,當PC訪問中央庫的時候,先通過Proxy下載到Nexus倉庫,然后再從Nexus倉庫下載到PC本地。
這樣的優勢只要其中一個人從中央庫下來了,以后大家都是從Nexus私服上進行下來,私服一般部署在內網,這樣大大節約的寬帶。
創建Proxy的具體步驟
1--點擊“Create Repositories”按鈕
2--選擇要創建的類型
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保存就可以了。