1. 程式人生 > 其它 >Maven私服Nexus3.x環境部署應用

Maven私服Nexus3.x環境部署應用

1.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)外掛或互動的工具,這種宣告性的模式。

2.私服介紹

私服是指私有伺服器,是架設在區域網的一種特殊的遠端倉庫,目的是代理遠端倉庫及部署第三方構建。有了私服之後,當 Maven 需要下載構件時,直接請求私服,私服上存在則下載到本地倉庫;否則,私服請求外部的遠端倉庫,將構件下載到私服,再提供給本地倉庫下載。

3.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客戶端,它佔用較少的記憶體,基於簡單檔案系統而非資料庫。

1.為什麼要構建Nexus私服

如果沒有Nexus私服,我們所需的所有構件都需要通過maven的中央倉庫和第三方的Maven倉庫下載到本地,而一個團隊中的所有人都重複的從maven倉庫下載構件無疑加大了倉庫的負載和浪費了外網頻寬,如果網速慢的話,還會影響專案的程序。很多情況下專案的開發都是在內網進行的,連線不到maven倉庫怎麼辦呢?開發的公共構件怎麼讓其它專案使用?這個時候我們不得不為自己的團隊搭建屬於自己的maven私服,這樣既節省了網路頻寬也會加速專案搭建的程序,當然前提條件就是你的私服中擁有專案所需的所有構件。

2.本地構建Nexus私服的好處

1)加速構建;
2)節省頻寬;
3)節省中央maven倉庫的頻寬;
4)穩定(應付一旦中央伺服器出問題的情況);
5)控制和審計;
6)能夠部署第三方構件;
7)可以建立本地內部倉庫;
8)可以建立公共倉庫
這些優點使得Nexus日趨成為最流行的Maven倉庫管理器。

4.maven的安裝

下載地址:http://maven.apache.org/download.cgi

提前在伺服器上安裝jdk環境(參考:https://www.cnblogs.com/qingbaizhinian/p/12201073.html)具體需要什麼版本,看我們我們需要安裝什麼版本的maven.

安裝過程

[root@test-no ~]# cd /usr/local/src/
[root@test-no src]# wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@test-no src]# tar -zvxf apache-maven-3.3.9-bin.tar.gz
[root@test-no src]# ll
total 8296
drwxr-xr-x 6 root root      99 May 13 14:10 apache-maven-3.3.9
-rw-r--r-- 1 root root 8491533 Nov 18  2015 apache-maven-3.3.9-bin.tar.gz
[root@test-no src]# mv apache-maven-3.3.9 /usr/local/maven
#接著配置系統環境變數,在/etc/profile檔案底部新增如下內容:
[root@test-no java]# vim /etc/profile
。。。。
export JAVA_HOME=/usr/java/default                #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@test-no java]# source /etc/profile
#最後驗證是否安裝成功,出現如下資訊,說明安裝成功
[root@test-no java]# mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_241, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_241-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"

5.Nexus安裝

Nexus的安裝有兩種實現方式:

1.war包安裝方式

下載地址:https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.2-01.war
直接將war包放在tomcat的根目錄下,啟動tomcat就可以用了

2.原始碼安裝方式

下載地址:https://www.sonatype.com/download-oss-sonatype (雲盤下載:連結:https://pan.baidu.com/s/1BbKcMODLnciSi6oHVYWm8g
提取碼:lb8j)

[root@test-no ~]# cd /usr/local/src/
[root@test-no src]# wget https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.12.1-01-unix.tar.gz
[root@test-no src]# tar -zxvf nexus-3.12.1-01-bundle.tar.gz
[root@test-no src]# mv nexus-3.12.1-01 /usr/local/nexus
[root@test-no 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}
#啟動nexus(預設埠是8081)
[root@test-no 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@test-no src]# vim /etc/profile
export RUN_AS_USER=root
[root@test-no src]# source /etc/profile
[root@test-no src]# lsof -i:8081      #nexus服務啟動成功後,需要稍等一段時間,8081端口才起來
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 18742 root 914u IPv4 2577829 0t0 TCP *:tproxy (LISTEN

這個時候一般就可以進行訪問了,如果訪問出問題,用下面的解決方法

在部署機上的iptables裡開啟8081埠
這裡需要注意的是centos7下/etc/sysconfig/目錄沒有iptables,解決方法如下:
1.不管防火牆關沒關,都是用systemctl stop firewalld 關閉防火牆。
2.然後使用yum install iptables-services 安裝或者更新服務
3.然後使用systemctl enable iptables 啟動iptables
4.最後使用systemctl start iptables 開啟iptables
5.輸入命令vim /etc/sysconfig/iptables
6.既可以修改iptables檔案
[root@test-no src]# vim /etc/sysconfig/iptables
。。。。
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
[root@test-no src]# systemctl restart iptables
訪問nexus,即http://localhost:8081 (如果出現404,就訪問http://localhost:8081/nexus),如果訪問還是沒反應,多是防火牆的問題,
解決方法可以參考學習一下,防火牆的相關配置,如果上線緊急,可以粗暴點,直接iptables -F先清空防火牆

進入web頁面發現上面的提示,解決方法如下

[root@test-no ~]# vim /etc/security/limits.conf   #修改配置檔案,加入下面兩行
* soft nofile 65536
* hard nofile 65536
[root@test-no ~]# /usr/local/nexus/bin/nexus restart      #重啟nexus

6.Nexus的說明和使用

1.Nexus預設的倉庫型別

在介面中點選 配置的圖示,點選 Repositorys,就可以看見倉庫的列表資訊,可以看見倉庫有一個欄位型別叫Type,如下圖所示

1、hosted(宿主倉庫): 主要用於儲存無法從中央倉庫獲取的包(比如資料庫的驅動包),以及微服務專案之前依賴的API包(比如商品系統需要呼叫價格系統的 API)
2、proxy (代理倉庫):代理公共的遠端倉庫(比如,所有的伺服器都只能訪問內外伺服器,而只有這臺伺服器可以訪問外網時,就可以用這臺伺服器為所有的機器做一層代理)
3、virtual 虛擬倉庫:用於適配 Maven 1
4、group (倉庫組):倉庫組,用來合併多個hosted/proxy倉庫,當你的專案希望在多個repository使用依賴項時,無需引用多個倉庫了,只需要引用一個型別為group的repository即可,下載時按配置順序從中依次查詢,。

2.component name的一些說明:

1)maven-central:maven中央庫,預設從https://repo1.maven.org/maven2/拉取jar ,這個地址在國外,一般我們在這裡會把改成國內阿里雲的http://maven.aliyun.com/nexus/content/groups/public
2)maven-releases:私庫發行版jar
3)maven-snapshots:私庫快照(除錯版本)jar
4)maven-public:倉庫分組,把上面三個倉庫組合在一起對外提供服務,在本地maven基礎配置settings.xml中使用。

3.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前面,下載包會更快。

4.nexus目錄和配置檔案介紹

1.Nexus預設的埠是8081,可以在etc/nexus-default.properties配置中修改。

2.Nexus預設的使用者名稱密碼是admin/admin123

3.當遇到奇怪問題時,重啟nexus,重啟後web介面要1分鐘左右後才能訪問。

4.Nexus的工作目錄是sonatype-work(路徑一般在nexus同級目錄下)

[root@test-no nexus]# pwd
/usr/local/nexus
[root@test-no nexus]# ll etc/nexus-default.properties 
-rw-r--r-- 1 nexus nexus 341 Jun  8  2018 etc/nexus-default.properties
[root@test-no nexus]# cd ..
[root@test-no local]# ll sonatype-work/
total 0
drwxr-xr-x 14 nexus nexus 220 May 13 17:54 nexus3
[root@test-no local]# cd sonatype-work/
[root@test-no sonatype-work]# pwd
/usr/local/sonatype-work
[root@nexus1-no iflytek]# cat nexus/bin/nexus.vmoptions        #原始碼安裝的在這裡設定了啟動引數,這裡可以知道資料目錄
-Xms1200M
-Xmx1200M
-XX:MaxDirectMemorySize=2G
-XX:+UnlockDiagnosticVMOptions
-XX:+UnsyncloadClass
-XX:+LogVMOutput 
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=../sonatype-work/nexus3                       #這裡就是指定資料目錄
-Djava.io.tmpdir=../sonatype-work/nexus3/tmp
-Dkaraf.startLocalConsole=false

5.倉庫的建立和許可權的配置

1.倉庫的建立

2.許可權的建立

資料許可權:repository許可權有兩種型別,repository admin和repository view,每種型別又有6種許可權標識,分別是:*,add,browse、delete、edit、read,*包含其它5種許可權,也可以自定義操作標識,正常系統的生成許可權足夠使用

  • nx-repository-admin 開頭的是針對倉庫本身的相關許可權
  • nx-repository-view 開頭的是針對倉庫裡jar的相關許可權

3.角色的建立

4.使用者的建立

至此nexus倉庫的建立和許可權指定已演示完畢。接下來演示nexus結合maven進行依賴倉庫的使用和依賴元件的上傳

6.新建的hosted和proxy庫如何加入指定倉庫組

具體操作步驟如下圖

7.依賴包上傳倉庫

1.通過專案層面進行上傳

1.在專案的pom.xml配置相關資訊

<distributionManagement>
   <repository>
      <id>test-release</id>            #這裡的name和id名字隨便取,但是id要和setting.xml裡一樣,因為需要指定有上傳的使用者許可權
      <name>test-release</name>
      <url>http://172.31.46.3:8081/repository/test-release/</url>
   </repository>
</distributionManagement>

2.在setting.xml配置相關資訊

<server>  
    <id>test-release</id>               #這個id隨便取,和pom.xml裡面的id一致就行。下面寫有許可權的賬號和密碼。
    <username>test-release</username>  
    <password>liu342622</password>  
</server>

3.進入專案所在目錄下執行

mvn deploy

2.通過web介面直接上傳

3.通過命令上傳

mvndeploy:deploy-file-DgroupId=IME.PyEngine.Test-DartifactId=Client.Make-Dversion=112 \
-Dpackaging=jar-Dfile=D:\AiInput\trunk\code_mix\Target\AiInput_RELEASE.jar
-Durl=http://maven.iflytek.com:8081/nexus/content/repositories/CTI-3rdParty/
-DrepositoryId=thirdparty

8.nexus跨主機遷移(附帶版本升級操作)

nexus跨主機遷移分跨主機同版本遷移和不同版本遷移。

1.跨主機同版本遷移

nexus的跨主機同版本遷移只需把nexus的主目錄和nexus的資料目錄sonatype-work傳到新的伺服器上就行,這個比較簡單。(這裡的同版本的意思是同一個大版本號)

2.同版本升級

這裡的同版本升級只是升級小版本號。列如2.10.4版本升級到2.14.8。這裡一般我都會在老版本的伺服器上直接安裝一個新的,然後改一個啟動埠號,然後把老sonatype-work

目錄裡的資料拷到新的資料目錄裡,然後直接啟動就行了,這個時候你會發現系統上運行了兩個nexus,只是埠號不一樣。進新的nexus裡看資料對不對,發現數據完整的遷移過來了。
這個只需把老nexus停掉就行。這樣就完成了同版本升級了。

3.跨主機版本遷移(跨版本升級一樣)

nexus跨版本主機遷移的話,這個比較麻煩,列如從2.10.4版本的nexus遷移到3.12.1,這裡遷移之前還需要把2.10.4版本升級到2.14.8或者更新的2.幾版本,這樣才能進行跨版本遷移,
不然你直接遷移的話,就會報版本不支援的提示,提示裡會告訴你老機器需要是什麼版本nexux才能遷移到新的nexus裡

如果不升級成2.14.8,下面的遷移動作會報下面的提示,為了不做重複工,我們提前升級成2.14.8

準備工作做好後,執行下面操作進行跨版本遷移。

首先在老版本機器上配置Upgrade:Agent,Upgrade:Agent的配置比較簡單,如下

上圖中的Access Token非常重要,進行遷移的時候要用這個值,你可以設一個自己容易記得值,我這裡設成qingbai123下圖就是我們設定好的Upgrade:Agent

然後我們到新版本nexus上執行下面操作,首先開啟Upgrade功能,如下

接著在新nexus上執行遷移操作,nexus遷移操作是在web介面完成的,具體操作如下

上圖中的url填寫的是老nexus的web訪問地址,Access Token是老nexus的Upgrade:Agent中配置的是qingbai123。

下面基本就可以一路next就行了。

上圖說明已經倉庫已經遷移完畢,下面我們可以通過web介面和du -sh驗證這老新兩個倉庫的完整性。