使用Docker搭建Nexus私有倉庫


前言

最近項目需要對接銀行系統,對方提供了一些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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM