1、私服的介紹
私服指的就是私有服務器,是架設在局域網的一種特殊的遠程倉庫,但搭建私服的服務器可以訪問外網,目的是代理遠程倉庫及部署第三方構建。有了私服之后,當開發人員需要使用Maven下載構件時,本地倉庫會直接請求私服,私服上存在則下載到本地倉庫,否則私服請求外部的遠程倉庫,將構件下載到私服,再提供給本地倉庫下載,當然本地倉庫也可以上傳架構到私服供其他開發人員下載使用。
現在市面上有3種專門的maven倉庫管理軟件可以用來幫助我們搭建私服,分別是:
- Apache基金會的archiva:http://archiva.apache.org/
- JFrog的Artifactory:https://www.jfrogchina.com/
- Sonatype的Nexus:https://www.sonatype.com/
這些都是開源的私服軟件,有免費的版本,也有收費的版本。而用的最多的是第三種Nexus,所以本文我們主要以這個來講解,其他2種有興趣的朋友可以去研究一下。
2、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客戶端,它占用較少的內存,基於簡單文件系統而非數據庫。
3、為什么使用nexus
我們平時自己在開發的時候,都是通過maven的中央倉庫或者是第三方遠程倉庫下載的jar,對於一個人來說要求不多。但如果是公司合作開發一個項目,而這個項目可能需要幾十甚至上百人,那么整個團隊中的每個人都從遠程倉庫中把需要依賴的jar下載到本地倉庫,這不僅對公司的寬帶來說要求比較高,而且重復的從maven倉庫下載jar無疑加大了倉庫的負載和浪費了外網帶寬,如果網速慢的話,還會影響項目的進程。並且大部分公司為了保護數據安全,都會限制訪問外網,所以項目組大部分人員是不能訪問maven的中央存儲庫和其它遠程倉庫,那么開發人員又要從倉庫下載jar包怎么辦呢?此時公司一般都會搭建只限內網能夠訪問maven私服,然后把maven私服串聯到一台有外網權限的機器,這樣既節省了網絡帶寬也會加速項目搭建的進程,而且私服照樣可以聯通中央倉庫和其它倉庫。
4、nexus的優點
所以通過上面的分析總結出使用私服的好處有:
- 節省外網帶寬。
- 加速Maven構建。
- 部署第三方構件。
- 提高穩定性,增強控制。
- 降低中央倉庫的負荷。
- 控制和審計
- 建立本地內部公用倉庫
5、nexus的下載
前提:nexus是基於Java開發的,所以安裝系統一定要配置好JDK。
官方網站:https://www.sonatype.com/
下載的網站:https://www.sonatype.com/nexus-repository-oss
好像現在國內已經訪問不了這個網站了,反正我是FQ出去在官網下載的。
如果你翻不了牆,我這里也提供了百度網盤的鏈接:
鏈接:https://pan.baidu.com/s/1e66PEnIxROPjk3KZcur1sA 提取碼:av8h
①、下載網站打開之后如下圖。
②、然后填寫郵箱(隨便填寫一下即可)。
③、下載你要哪個操作系統的NEXUS。
之后等待系統響應會彈出下載頁面(網不好可能等的久一點)。下載之后的到一個壓縮包。下面我們安裝nexus。
6、win系統中安裝nexus
①、首先我們解壓下載的nexus壓縮包,解壓之后會產生兩個文件目錄nexus-3.24.0-02nexus-3.19.1-01和sonatyp-work。
②、啟動nexus。在解壓的nexus文件的bin目錄下輸入cmd。
③、然后再輸入nexus.exe /run運行。
等待系統運行完成后,我們在瀏覽器訪問:
http://localhost:8081/
注意:如果nexus在啟動時出現了下面的異常請忽略掉它,這是編碼問題 不影響使用。
java.io.UnsupportedEncodingException: Encoding GBK is not supported yet (feel free to submit a patch)
瀏覽器輸入地址訪問后頁面是這樣的則表示nexus成功啟動了。(如果端口沖突,它的默認端口配置在etc/nexus-default.properties文件里自行修改)
因為nexus是使用java開發的web項目,並且內置了jetty web容器,所以可以直接在瀏覽器中運行。
7、nexus的登錄
上面全都完成之后,我們還要登錄才能使用nexus,點擊上圖右上角的Sign in,輸入用戶名和密碼。
nexus默認用戶名是admin,但是密碼已經不是admin123了。網上大部分是以前的版本了,默認的登錄賬號為admin;登錄密碼為admin123。但是新版本已經不是了。
nexus新版本的密碼是第一次啟動的時候生成的,密碼位於下面的文件中,我們有軟件打開便可獲取。
安裝目錄/sonatype-work/nexus3/admin.password
①、登錄成功后會彈出一些設置,如下:
點擊Next,設置新的登錄密碼(新密碼要保存好),如下:
②、設置是否匿名訪問,這個最好允許,否則訪問很麻煩。
③、然后點擊Next->Finish完成設置。
這樣nexus的登錄就完成了。如果要停止nexus的話,在啟動的cmd窗口中按:Ctrl+C即可停止。
8、nexus的倉庫類型
我們在登錄nexus之后,點擊【工具——>Repositories】。
可以發現Nexus倉庫類型分為以下3個:
- proxy(代理倉庫):用來代理遠程的公共倉庫,默認是從遠程中央倉庫中尋找數據的倉庫。它負責代理包
- hosted(宿主倉庫):用來部署我們自己項目打包的構建,供內部人員下載。它負責上傳包
- group(倉庫組):用來合並多個hosted/proxy倉庫,都加入到“maven-public”倉庫組中,下載時按配置順序從中依次查找。它負責提供包
①、proxy倉庫
代理倉庫是用來代理第三方公共的遠程倉庫,默認是從遠程中央倉庫中尋找數據的倉庫,我們也可以通過代理倉庫代理其它的maven倉庫,如阿里的maven倉庫等。當用戶本地倉庫沒有構建時,就會在私服中查找,如果私服還沒有,則通過被代理的倉庫中下載構建,然后下載緩存在私服中供大家使用,這樣的優勢只要其中一個人從遠程庫下來了,以后大家都是從Nexus私服上進行下來,私服一般部署在內網,這樣可以大大節約的寬帶。
由於國內基本上都用的是阿里雲的倉庫,所以接下來我們在nexus中創建一個阿里雲的maven代理倉庫,來看下過程如下:
1)、在Repositories列表中點擊【Create repository】,如下圖:
2)、進入添加頁面,我們要選擇的是【maven2(proxy)】,它表示的是maven代理倉庫,如下圖:
3)、然后填寫倉庫名稱、倉庫類型、倉庫代理地址,如下:
- 倉庫名稱:maven-aliyun
- 倉庫類型:Release
- 代理地址:https://maven.aliyun.com/nexus/content/groups/public/
4)、最后點擊底部的【Create repository】創建完成,如下圖:
②、hosted倉庫
宿主倉庫用來部署我們自己項目打包的構建,主要是給我們的內部人員下載使用。我們可以將自己開發好的構建發布到宿主倉庫中供其他開發人員使用。
nexus默認義了2個宿主倉庫,分別是maven-releases, maven-snapshots。
- maven-releases:這里存放我們自己項目中發布的構建, 通常是Release版本,即發布的版本。
- maven-snapshots:這個倉庫非常的有用, 它的目的是讓我們可以發布那些Snapshots版本, 即不穩定,還需要測試的版本。
hosted倉庫的創建和proxy倉庫是一致的,具體步驟和上面基本一致。如下:
在創建的時候要注意Deployment Pollcy要改成“Allow redeploy”。
然后點擊底部的【Create repository】創建完成。
③、group倉庫
倉庫組主要是將proxy倉庫和hosted倉庫合並,它可以合並多個proxy倉庫和hosted倉庫,所以當maven用戶訪問訪問一個倉庫組的時候,就可以間接的訪問這個組內所有的倉庫,而倉庫組中多個倉庫是有順序的,當maven用戶從倉庫組下載構件時,倉庫組會按順序依次在組內的倉庫中查找組件,查找到了立即返回給本地倉庫,所以一般情況我們會將速度快的放在前面。倉庫組內部實際上是沒有構件內容的,他只是起到一個請求轉發的作用,將maven用戶下載構件的請求轉發給組內的其他倉庫處理。
下面我們將之前創建的maven-aliyun代理倉庫和maven-test宿主倉庫進入到倉庫組,如下:
1)、首先打開maven-public,如下:
2)、把名稱為maven-aliyun和maven-test的拖過去或者選中然后點擊 > 按鈕,同時也可以發現右邊的成員已經默認添加了三個,分別是宿主倉庫的兩個(maven-releases、maven-snapshots)和代理倉庫(maven-central)。
3)、由於阿里雲的倉庫在國內下載速度很快,所以我們把它放在中央倉庫的前面。
最后點擊Save保存即可。
9、配置maven從nexus下載構建
配置maven從nexus下載構建有兩種方式:①、pom.xml方式。②、鏡像方式。
①、pom.xml方式
1)、首先我們創建一個maven項目,並且修改該項目的pom.xml文件,加入如下內容:
<repositories> <repository> <id>maven-nexus</id> <url>http://localhost:8081/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
注意:url地址對應到nexus上的哪個倉庫組,因為只有倉庫組提供包,我們可以在nexus上面復制地址,如下:
2)、因為nexus是需要用戶名和密碼才能訪問,所以在maven的setting.xml中添加如下配置(大概在125行左右),我們最好先備份一份原始的setting.xml文件。
<server> <id>maven-nexus</id> <username>admin</username> <password>123456</password> </server>
注意:上面<id>元素的值和pom.xml中的<id>值必須一致。 <server>元素中的username和password根據自己去設置,我這里密碼設置的是123456。
3)、例如我們要下載jdbc的mysql連接驅動的jar包,首先確保本地倉庫是沒有的,否則會從本地倉庫拿,如果有先刪除。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency>
4)、然后我們編譯項目:mvn compile ,執行結果如下:
從運行結果可以發現mysql驅動的jar包從maven-nexus中下載了,下載地址正是我們nexus私服中的那個地址。
②、鏡像方式
以上面創建的那個maven項目為例。
1)、修改maven的setting.xml文件,加入如下配置(大概在163行):
<mirror> <id>mirror-nexus</id> <name>nexus-mirror</name> <url>http://localhost:8081/repository/maven-public/</url> <mirrorOf>*</mirrorOf> </mirror>
注意:上面mirrorOF配置的*,說明所有遠程倉庫都通過該鏡像下載構件。
2)、登錄的用戶名和密碼配置不變(id改了一下):
<server> <id>mirror-nexus</id> <username>admin</username> <password>123456</password> </server>
id元素與上面setting.xml中配置的id同樣必須相同。
3)、下載jdbc的mysql連接驅動的jar包,記得刪除本地倉庫的jar包。
4)、編譯項目:mvn compile ,執行結果如下:
可以發現同樣是從mirror-nexus中下載的jar。
10、配置本地構建上傳至nexus
nexus配置部署有兩種方式:①、maven上傳。②、手動上傳。
①、maven上傳
我們知道,nexus私服的宿主倉庫是用來存儲用戶自己上傳的jar,它提供了兩個默認的宿主倉庫分別用來存放SNAPSHOT版本和RELEASE版本。
而我們在上傳jar的時候只需要更改pom中的<version>元素中內容即可:
- 上傳為 maven-snapshot 時 在<version>1.0-SNAPSHOT</version>加上-SNAPSHOT, 表示不穩定的,會反復發布、測試、修改的版本。
- 上傳為 maven-releases 時 要把<version>1.0</version> 中的-SNAPSHOT去掉,表示這是一個發布版本。
maven上傳jar的具體操作如下:
1)、修改pom.xml文件,加入下面內容:
<distributionManagement> <repository> <id>release-nexus</id> <url>http://localhost:8081/repository/maven-releases/</url> <name>nexus-release</name> </repository> <snapshotRepository> <id>snapshot-nexus</id> <url>http://localhost:8081/repository/maven-snapshots/</url> <name>nexus-snapshot</name> </snapshotRepository> </distributionManagement>
上面2個url分別對應的是nexus中兩個宿主倉庫的地址。
2)、修改settings.xml,配置nexus登錄用戶名和密碼信息。
<server> <id>release-nexus</id> <username>admin</username> <password>123456</password> </server> <server> <id>snapshot-nexus</id> <username>admin</username> <password>123456</password> </server>
id要與distributionManagement中id對應。
3)、執行 mvn deploy 命令,結果如下:
從運行結果可以發現我們的jar已經上傳至maven-snapshot中了。
4)、查看上傳的jar,我們訪問nexus私服中快照版本倉庫的地址:
http://localhost:8081/repository/maven-snapshots/
如果出現了如下頁面,點擊上面的browse鏈接。
然后我們就可以看到上傳的jar包了。
如果別人要使用我的jar包的話,只需選中以pom結尾的文件,右邊會顯示這個jar的坐標。
至此maven上傳jar包已經全部介紹完畢了。
release穩定版本發布到nexus私服和這個一樣,就是改一下version元素后面的內容即可,所以就不演示了。
②、手動上傳
手動上傳一般是用來上傳第三方給我們的jar包,例如某個合作商給了一個jar包,這時我們不能使用maven方式上傳,而這個包遠程倉庫是不存在的,大家又要共同使用這個包,此時我們就可以手動將這個jar上傳到私服供所有開發使用。但目前手動上傳只支持發布穩定版本的構件。
1)、登錄nexus之后,按照下圖的步驟依次進行操作。
2)、我們把target目錄下打包的項目的jar上傳,並且依次填寫好坐標信息,最后點擊upload按鈕。
3)、查看上傳的jar,點擊右邊的Browse,然后選擇maven-releases。
進來之后就可以看到我們手動上傳的包了。
11、linux系統中安裝nexus
當然我們一般都不會把nexus私服搭建在Windows系統中,而是建在Linux系統中,所以下面介紹在Linux系統中如何搭建私服。Linux版的nexus文件可以在官網下載,也可以在前面提供的百度網盤中獲取。然后用Xftp工具上傳到Linux系統中。
注意:nexus是基於Java開發的,所以安裝系統一定要配置好JDK。可以參考:在CentOS7上配置JDK和Tomcat
①、上傳nexus
首先在/opt 目錄下新建一個nexus目錄:
[root@localhost ~]# mkdir /opt/nexus
然后將nexus壓縮包用Xftp上傳到這個目錄。
②、解壓nexus
進入創建的nexus目錄進行解壓:
[root@localhost ~]# cd /opt/nexus/ [root@localhost nexus]# tar -zxvf nexus-3.24.0-02-unix.tar.gz [root@localhost nexus]# ls nexus-3.24.0-02 nexus-3.24.0-02-unix.tar.gz sonatype-work
③、配置虛擬機內存
nexus運行依賴於jvm,而我的nexus默認運行內存如下:
[root@localhost bin]# vi /opt/nexus/nexus-3.24.0-02/bin/nexus.vmoptions
它這個運行內存已經遠大於系統物理內存,因為jvm分配的內存太大,會導致nexus啟動不了,在運行的時候就會報錯,報錯信息如下:
上面就是說虛擬機運行環境的內存分配不夠,所以我們要給它調整一下(測試環境下)。
進來之后按 i 鍵,改完后按esc然后 :wq 完成。
④、啟動nexus
nexus常用的一些命令包括:./nexus {start|stop|run|run-redirect|status|restart|force-reload}。
start和run啟動nexus的區別:start不能看到nexus的運行信息,而run可以,甚至打印錯誤信息。
下面我們啟動nexus(默認端口是8081):
說明已經啟動成功,上面warning意思是nexus建議不要用root用戶來啟動nexus,但並不影響啟動(nexus的啟動較慢,等個1-3分鍾)。
④、開放8081端口
#開放端口 firewall-cmd --zone=public --add-port=8081/tcp --permanent #重啟端口 firewall-cmd --reload #查看開放端口 firewall-cmd --zone=public --list -ports
⑤、驗證效果
瀏覽器輸入 http://ip:8081/ 之后如果有nexus界面則表示成功了。
⑥、登錄nexus
登錄賬號為:admin,密碼在/opt/sonatype-work/nexus3/admin.password
[root@localhost bin]# vi /opt/nexus/sonatype-work/nexus3/admin.password
參考資料: