前言
最近項目需要對接銀行系統,對方提供了一些jar包,這些三方jar是沒有上傳到中央倉庫的,所以無法直接在maven中依賴,因此決定搭建一個Maven私服來處理。
maven倉庫的使用結構如下圖:
通常,我們開發項目並沒有使用到虛線標識的那兩部分,基本都是通過本機的Maven直接訪問中央倉庫,下載jar包到本地倉庫。現在我們需要搭建中間虛線部分。
一、docker安裝nexus
1、下載鏡像
官方鏡像地址:https://hub.docker.com/r/sonatype/nexus3/tags
#docker pull sonatype/nexus3 //下載鏡像
2、安裝
#mkdir /usr/local/docker/nexus //新建目錄 #chmod 777 /usr/local/docker/nexus //修改權限 //nexus默認使用8081端口 #docker run -d --restart=always -p 8081:8081 --name nexus -v /usr/local/docker/nexus:/nexus-data sonatype/nexus3
3、nexus密碼
安裝完成后可訪問管理平台:http://ip:8081
默認管理員用戶名:admin 密碼:admin123
如果提示密碼不對,需要到容器里面去修改密碼。方式如下:
//進入容器 #docker exec -it nexus /bin/bash //進入/opt/sonatype/sonatype-work/sonatype-work/目錄,找到admin.password文件,里面的內容就是密碼 #cat admin.password
紅色部分就是admin的密碼。這個只是臨時密碼,修改密碼后admin.password文件會消失。
二、配置nexus
登錄nexus管理平台后(注意必須admin登錄才行,不然只能瀏覽模式),可以看到如下界面:
1、創建Blob stores
在創建repository之前,還需要先指定文件存儲目錄,便於統一管理。就需要創建Blob stores
創建好后可以看到blob stores有兩個,一個是系統默認的,一個是剛創建的。如果不想自己創建,使用系統默認的文件存儲目錄(在sonatype-work/nexus3/blobs)也是可以的。到時候創建repository時,存儲目錄選擇default就可以了。
2、nexus倉庫
如圖所示,代理倉庫負責代理遠程中央倉庫,托管倉庫負責本地資源,組資源庫 = 代理資源庫 + 托管資源庫。
3、創建proxy repository代理倉庫
選擇maven2(proxy),代理倉庫
設置代理倉庫
其他的可以采用默認,以后需要修改的可以再修改。
4.創建hosted repository倉庫
上圖的Hosted設置選項,選項中有三個值:
**Allow redeploy**:允許同一個版本號下重復提交代碼, nexus以時間區分
**Disable redeploy**:不允許同一個版本號下重復提交代碼
**Read-Only**:不允許提交任何版本
原生的maven-releases庫是Disable redeploy設置, maven-snapshots是Allow redeploy。
5、創建group repository組倉庫
將hosted repositories宿主倉庫的順序放在proxy repositories代理倉庫之前,因為一個group倉庫組中可以包括宿主倉庫和代理倉庫。而整個group repository是作為一個public repository給用戶使用的。
所以當查找jar包的時候,如果代理資源庫在前面,那就是先從遠程去查找jar包,而不是先從宿主倉庫(本地倉庫)去查找jar包。
三、設置maven
Maven下的setting.xml文件和項目中的pom.xml文件的關系是:settting.xml文件是全局設置,而pom.xml文件是局部設置。pom.xml文件對於項目來說,是優先使用的。而pom.xml文件中如果沒有配置鏡像地址的話,就按照settting.xml中定義的地址去查找。
1、修改maven配置文件setting.xml
如上圖方式獲取組倉庫smart_group的倉庫地址,修改setting.xml文件如下:
<!--nexus服務器,id為組倉庫name--> <servers> <server> <id>smart_group</id> <username>admin</username> <password>admin123</password> </server> </servers>
<!--倉庫組的url地址,id和name可以寫組倉庫name,mirrorOf的值設置為central--> <mirrors> <mirror> <id>smart_group</id> <name>smart_group</name> <url>http://******:8081/repository/smart_group/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
修改后可以重新編譯項目,必須添加參數-U,(-U,--update-snapshots,強制更新releases、snapshots類型的插件或依賴庫,否則maven一天只會更新一次snapshot依賴)。代理倉庫會從遠程中央倉庫下載jar包
#mvn clean compile -U
這個時候可以看到代理倉庫已經從中央倉庫下載了項目編譯需要的jar包。同樣地,在組倉庫中也能看到所有的jar包,包括代理倉庫和宿主倉庫的。
2、通過管理平台上傳三方jar包
有些jar是第三方提供的,在中央倉庫中是沒有的,我們可以上傳這些本地三方jar包到hosted repository宿主倉庫中。
上傳成功后,就可以看到hosted repository和group repository中已經有了剛上傳的三方jar包
然后項目中通過編譯打包就可以下載jar包到本地repository中了,記住maven clean、compile、package首次執行時加參數-U。
3、通過命令上傳三方jar包
在setting.xml配置文件中添加hosted repository server
<!--id自定義,但是在使用命令上傳的時候會用到--> <server> <id>smart_hosted</id> <username>admin</username> <password>admin123</password> </server>
使用如下命令上傳jar包:
mvn deploy:deploy-file -DgroupId=com.alan6.land -DartifactId=land-user -Dversion=0.0.1 -Dpackaging=jar -Dfile=d:\land-service-user.jar -Durl=http://ip:8081/repository/smart_group/ -DrepositoryId=smart_group
命令解釋:
-DgroupId=com.alan6.land 自定義
-DartifactId=land-user 自定義
-Dversion=0.0.1 自定義,三個自定義,構成pom.xml文件中的標識
-Dpackaging=jar 傳的類型是jar類型
-Dfile=D:\jar\land-user-0.0.1.jar jar包的本地磁盤位置
-Durl=http://ip:8081/repository/smart_hosted/ hosted資源庫的地址
-DrepositoryId=smart_hosted 需要和setting.xml文件中配置的ID一致
上傳成功后,hosted repository中已經可以看到了
四、deploy部署jar包到私服
1、release和snapshots jar包區別
SNAPSHOT版本代表不穩定(快照版本),還在處於開發階段,隨時都會有變化。當上傳同樣的版本號jar包的時候,SNAPSHOT會在版本號的后面自動追加一串新的數字,即日志標簽,nexus會根據日志標簽區分出不同的版本,在maven引用時,如果使用的是snapshot版本,重新導入maven的時候,會去私庫拉取最新上傳的代碼。
RELEASE則代表穩定的版本(發布版本),一般上線后都會改用RELEASE版本。也就是說1.0,2.0這樣的版本只能有一個,也就是說當前版本號下,不可能出現不同的jar。
2、創建snapshot倉庫
可以在nexus上添加一個snapshot倉庫,專門用於存放snapshot版本的jar包。snapshot倉庫也是hosted類型的,創建方式和hosted repository類型。創建好后,加入到組倉庫里面就可以了。
3、項目pom.xml文件配置
可以在項目的pom文件中設置具體的relaeses庫和snapshots庫。如果當前項目的版本號的后綴名中帶着-SNAPSHOT,類似<version>***-SNAPSHOT</version>,就會將項目jar包提交到snapshots庫中,沒有帶-SNAPSHOT的話會提交releases庫中。
在pom.xml文件中配置 distributionManagement 節點如下,在項目中執行deploy命令后,jar包將會被上傳到nexus中。
<distributionManagement> <repository> <id>nexus-releases</id> <!--release版本倉庫--> <name>Nexus Release Repository</name> <url>http://ip:8081/repository/smart_hosted/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <!--snapshot版本倉庫--> <name>Nexus Snapshot Repository</name> <url>http://ip:8081/repository/smart_snapshots/</url> </snapshotRepository> </distributionManagement>
默認地,maven編譯打包不會下載SNAPSHOT版本的jar包,所以還需要在pom.xml文件中配置支持下載snapshot版本jar包。
<repositories> <repository> <id>smart_group</id> <url>http://ip:8081/repository/smart_group/</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
至此,nexus搭建完畢,支持本地部署依賴jar包
參考資料
1、https://blog.csdn.net/localhost01/article/details/84350773
2、https://blog.csdn.net/lupengfei1009/article/details/93202578