研發提效必備技能:手把手教你基於Docker搭建Maven私服倉庫

2023-12-21 12:00:33

沉澱,成長,突破,幫助他人,成就自我。

大家好,我是冰河~~

在研發的過程中,很多企業都會針對自身業務特點來客製化研發一些工具類庫,但是這些工具類庫又不會對外公開,那如何在組織內部共用這些類庫呢?一種很好的方式就是在公司內部搭建一套Maven私服倉庫。

一、背景知識

搭建Maven私服倉庫可以提高專案構建和部署的效率、穩定性和安全性,同時方便管理內部開發的元件和私有庫,比較適用於企業內部或者特定場景下的需求。

就拿我們星球的分散式IM即時通訊系統來說,對於後端服務,我們將其劃分成了 多系統共用模型與工具、即時通訊後端服務、大後端平臺、即時通訊SDK、OpenAI大模型接入服務 等。

其中,多系統共用模型與工具會被其他服務依賴,即時通訊SDK和OpenAI大模型接入服務也會被其他服務依賴,並且多系統共用模型與工具、即時通訊SDK和OpenAI大模型接入服務都是我們開發分散式IM即時通訊系統時的私有庫和元件,所以,在設計和研發分散式IM即時通訊系統的過程中,我們也需要搭建一套自己的Maven私服來統一管理這些私有庫和元件。

好了,那接下來,我們就一起搭建Maven私服倉庫吧。

二、環境說明

  • 伺服器版本:CentOS7
  • 主機名:binghe102
  • IP地址:192.168.106.102
  • Maven私服映象:sonatype/nexus3

三、環境搭建

基於Docker搭建Maven私服的步驟如下所示。

3.1下載Nexus3映象

在伺服器命令列輸入如下命令,下載Nexus3映象。

docker pull sonatype/nexus3

這裡,視網路情況,可能需要耐心等待一會兒。

3.2 檢視Nexus3映象

在伺服器命令列輸入如下命令,檢視下載的Nexus3映象。

[root@binghe102 ~]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
sonatype/nexus3   latest    589f7296a4a2   23 months ago   655MB

可以看到,已經成功下載Nexus3映象。

3.3 建立Nexus3掛載資料夾

在伺服器命令列輸入如下命令,建立nexus的掛載資料夾。

mkdir /usr/local/nexus-data && chown -R 200 /usr/local/nexus-data

3.4 啟動Nexus3容器

在伺服器命令列輸入如下命令,啟動Nexus3容器。

docker run -d -p 8081:8081 --name nexus -v /usr/local/nexus-data:/nexus-data --restart=always sonatype/nexus3

可以看到,在上述啟動命令中,我們將Nexus3容器的/nexus-data目錄對映到了宿主機的/usr/local/nexus-data目錄。此時,Nexus3容器執行過程中,在/nexus-data目錄產生的檔案和紀錄檔都會在宿主機的/usr/local/nexus-data目錄中檢視到。

3.5 檢視Nexus3容器啟動狀態

在伺服器命令列輸入如下命令,檢視Nexus3容器啟動狀態。

[root@binghe102 ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
59e27830bbaa   sonatype/nexus3   "sh -c ${SONATYPE_DI…"   2 minutes ago   Up 2 minutes   0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   nexus

可以看到,Nexus3容器啟動成功,監聽了8081埠。

四、Nexus3設定

搭建完Nexus3環境後,我們還需要對其進行設定,具體設定的步驟如下所示。

4.1 開啟Nexus3頁面

Nexus3容器啟動時監聽的埠和宿主機埠都是8081,所以,我們在瀏覽器位址列輸入http://192.168.106.102:8081開啟Nexus3頁面,如圖1所示。

4.2 登入Nexus3

點選Nexus3右上角的登入,如圖2所示。

點選後會彈出如圖3所示的提示框。

根據提示得知,初始密碼的存放位置為/nexus-data/admin.password,因為我們在啟動Nexus3容器時,將Nexus3容器的/nexus-data目錄對映到了宿主機的/usr/local/nexus-data目錄,所以,我們在宿主機的/usr/local/nexus-data目錄中也能夠查詢到admin.password檔案。

所以,在宿主機中輸入如下命令即可檢視到admin.password檔案。

ll /usr/local/nexus-data

具體如圖4所示。

輸入如下命令檢視admin.password檔案的內容。

[root@binghe102 ~]# cat /usr/local/nexus-data/admin.password 
517842df-1a2d-49c9-b4c3-b9ad4cf0fe00

此時,我們就檢視到登入Nexus3的admin賬號的密碼為517842df-1a2d-49c9-b4c3-b9ad4cf0fe00,將admin賬號和對應的密碼輸入到圖3所示的提示框中,即可登入Nexus3,如圖5所示。

登入後的介面如圖6所示。

可以看到,首次登入後會自動彈出完成必要設定的提示框,點選Next按鈕,設定新密碼,如圖7所示。

這裡,自行記錄新設定的密碼,用於後續登入Nexus。

點選Next按鈕,選擇nable anonymous access,如圖8所示。

點選Next按鈕,如圖9所示。

點選Finish按鈕,即可完成設定。

4.3 設定阿里雲代理倉庫

Nexus預設使用的遠端倉庫為maven-central,從這個遠端倉庫下載依賴很慢,經常連不上,如圖10所示。

滑鼠單機maven-central倉庫,檢視maven-central倉庫設定的遠端連結,如圖11所示。

可以看到,maven-central倉庫設定的遠端連結為https://repo1.maven.org/maven2/,從這個遠端倉庫下載依賴很慢,經常連不上,所有我們需要設定阿里雲遠端代理倉庫。

回到圖10所示的頁面,點選Create repository按鈕,如圖12所示。

點選後進入選擇倉庫型別的頁面,這裡我們選擇maven2(proxy)型別,如圖13所示。

點選選則maven2(proxy)型別後,進入設定遠端代理倉庫的頁面,如圖14所示。

其中,每個設定項如下所示。

接下來,拖動3-14頁面右側的卷軸,滑到最下面,點選Create repository按鈕,如圖15所示。

點選Create repository按鈕後,就可以在Repositories列表中看到新設定的阿里雲代理倉庫了,如圖16所示。

並且Status顯示的是Online - Ready to connect,說明阿里雲遠端倉庫設定成功。

4.4 設定倉庫組

接下來,需要將aliyun-central設定到倉庫組,並且將aliyun-central排在maven-central上面。具體步驟如下所示。

在Repositories列表中,點選maven-public,如圖17所示。

點選後進入如圖18所示的頁面。

下拉頁面右側的卷軸,找到如圖19所示的設定。

將aliyun-central移動到右側,並排在最上面,如圖20所示。

點選Save按鈕儲存設定。

4.5 建立使用者

接下來,建立一個用於上傳Jar包到倉庫的使用者,具體步驟如下所示。

點選Security選單下的Users選單,如圖21所示。

點選Users選單後,點選Create local user按鈕,如圖22所示。

隨後,按照圖23所示設定使用者的基本資訊。

這裡,自行記錄使用者的密碼,用於後續上傳jar檔案使用,設定好之後,點選底部的Create local user按鈕即可。點選後在Security選單下的Users選單的使用者列表中,可以檢視到新建立的本地使用者,如圖24所示。

至此,Nexus3設定完畢。

五、設定本地Maven倉庫

設定完Nexus後,接下來,還需要對原生的Maven倉庫進行設定,主要就是對Maven的的settings.xml檔案進行設定。

5.1 複製settings檔案

複製setting.xml檔案為setting-binghe.xml檔案,如圖25所示。

5.2 設定servers節點

在settings-binghe.xml檔案中,找到servers節點,在servers節點中,設定5.5節建立的使用者,如下所示。

<server>
    <id>binghe</id>
    <username>binghe</username>
    <password>binghe123</password>
</server>

5.3 設定mirrors節點

在settings-binghe.xml檔案中,找到mirrors節點,在mirrors節點中,設定倉庫地址,如下所示。

<!--本地私服倉庫地址-->
<mirror>
    <id>central</id>
    <name>Local Repository</name>
    <url>http://192.168.106.102:8081/repository/maven-public</url>
    <mirrorOf>*</mirrorOf>
</mirror>
<!--阿里雲倉庫地址-->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

5.4 設定profiles節點

在settings-binghe.xml檔案中,找到profiles節點,在profiles節點中,設定倉庫資訊,如下所示。

<profile>
    <id>maven-public</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
    <repositories>
        <repository>
            <id>nexus-public</id>
            <url>http://192.168.106.102:8081/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
</profile>

至此,Maven私服倉庫搭建完畢,並且本地Maven也已經設定完畢。

後續使用Maven構建專案時,指定使用binghe-settings.xml檔案即可將依賴的Jar檔案和生成的Jar檔案上傳到Maven私服倉庫,如果使用IDEA編譯專案,也需要在IDEA中,將Maven的組態檔指定為settings-binghe.xml。

注意:我已經將settings-binghe.xml檔案上傳到本節對應原始碼分支的environment/maven目錄下,大家自行獲取即可。

六、專案pom.xml設定

搭建完Maven私服倉庫,設定好本地Maven倉庫後,還需要在專案的pom.xml檔案中進行相應的設定,具體如下所示。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
        <!--釋出程式碼Jar外掛 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <version>2.8.2</version>
        </plugin>
        <!--釋出原始碼外掛 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<distributionManagement>
    <repository>
        <!--這裡的id與settings.xml中的servers節點設定的使用者ID一直,這樣才能使用設定的使用者去上傳到maven私有倉庫 -->
        <!--此倉庫對應的為RELEASE版本的jar-->
        <id>binghe</id>
        <url>http://192.168.106.102:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <!--這裡的id與settings.xml中的servers節點設定的使用者ID一直,這樣才能使用設定的使用者去上傳到maven私有倉庫 -->
        <!--此倉庫對應的為SNAPSHOT版本的jar-->
        <id>binghe</id>
        <url>http://192.168.106.102:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

是不是很簡單?你照著文章一步步實操,就可以基於Docker搭建屬於自己的Maven私服倉庫了。

七、寫在最後

這些真實場景的專案設計與落地實現,在冰河的知識星球除了分散式IM即時通訊系統外,還有其他5個專案,這些專案的需求、方案、架構、落地等均來自網際網路真實業務場景,讓你真正學到網際網路大廠的業務與技術落地方案,並將其有效轉化為自己的知識儲備

好了,今天就到這兒吧,我是冰河,我們下期見~~