研發(fā)提效必備技能:25張圖手把手教你基于Docker搭建Maven私服倉(cāng)庫(kù)
大家好,我是冰河~~
在研發(fā)的過程中,很多企業(yè)都會(huì)針對(duì)自身業(yè)務(wù)特點(diǎn)來定制研發(fā)一些工具類庫(kù),但是這些工具類庫(kù)又不會(huì)對(duì)外公開,那如何在組織內(nèi)部共享這些類庫(kù)呢?一種很好的方式就是在公司內(nèi)部搭建一套Maven私服倉(cāng)庫(kù)。
搭建Maven私服倉(cāng)庫(kù)可以提高項(xiàng)目構(gòu)建和部署的效率、穩(wěn)定性和安全性,同時(shí)方便管理內(nèi)部開發(fā)的組件和私有庫(kù),比較適用于企業(yè)內(nèi)部或者特定場(chǎng)景下的需求。
就拿我們星球的分布式IM即時(shí)通訊系統(tǒng)來說,對(duì)于后端服務(wù),我們將其劃分成了 多系統(tǒng)共用模型與工具、即時(shí)通訊后端服務(wù)、大后端平臺(tái)、即時(shí)通訊SDK、OpenAI大模型接入SDK 等。
其中,多系統(tǒng)共用模型與工具會(huì)被其他服務(wù)依賴,即時(shí)通訊SDK和OpenAI大模型接入SDK也會(huì)被其他服務(wù)依賴,并且多系統(tǒng)共用模型與工具、即時(shí)通訊SDK和OpenAI大模型接入SDK都是我們開發(fā)分布式IM即時(shí)通訊系統(tǒng)時(shí)的私有庫(kù)和組件,所以,在設(shè)計(jì)和研發(fā)分布式IM即時(shí)通訊系統(tǒng)的過程中,我們也需要搭建一套自己的Maven私服來統(tǒng)一管理這些私有庫(kù)和組件。
好了,那接下來,我們就一起搭建Maven私服倉(cāng)庫(kù)吧。
二、環(huán)境說明
- 服務(wù)器版本:CentOS7
- 主機(jī)名:binghe102
- IP地址:192.168.106.102
- Maven私服鏡像:sonatype/nexus3
三、環(huán)境搭建
基于Docker搭建Maven私服的步驟如下所示。
1、下載Nexus3鏡像
在服務(wù)器命令行輸入如下命令,下載Nexus3鏡像。
docker pull sonatype/nexus3
這里,視網(wǎng)絡(luò)情況,可能需要耐心等待一會(huì)兒。
2、查看Nexus3鏡像
在服務(wù)器命令行輸入如下命令,查看下載的Nexus3鏡像。
[root@binghe102 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sonatype/nexus3 latest 589f7296a4a2 23 months ago 655MB
可以看到,已經(jīng)成功下載Nexus3鏡像。
3、創(chuàng)建Nexus3掛載文件夾
在服務(wù)器命令行輸入如下命令,創(chuàng)建nexus的掛載文件夾。
mkdir /usr/local/nexus-data && chown -R 200 /usr/local/nexus-data
4、啟動(dòng)Nexus3容器
在服務(wù)器命令行輸入如下命令,啟動(dòng)Nexus3容器。
docker run -d -p 8081:8081 --name nexus -v /usr/local/nexus-data:/nexus-data --restart=always sonatype/nexus3
可以看到,在上述啟動(dòng)命令中,我們將Nexus3容器的/nexus-data目錄映射到了宿主機(jī)的/usr/local/nexus-data目錄。此時(shí),Nexus3容器運(yùn)行過程中,在/nexus-data目錄產(chǎn)生的文件和日志都會(huì)在宿主機(jī)的/usr/local/nexus-data目錄中查看到。
5、查看Nexus3容器啟動(dòng)狀態(tài)
在服務(wù)器命令行輸入如下命令,查看Nexus3容器啟動(dòng)狀態(tài)。
[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容器啟動(dòng)成功,監(jiān)聽了8081端口。
四、Nexus3配置
搭建完Nexus3環(huán)境后,我們還需要對(duì)其進(jìn)行配置,具體配置的步驟如下所示。
1、打開Nexus3頁(yè)面
Nexus3容器啟動(dòng)時(shí)監(jiān)聽的端口和宿主機(jī)端口都是8081,所以,我們?cè)跒g覽器地址欄輸入http://192.168.106.102:8081打開Nexus3頁(yè)面,如圖1所示。
2、登錄Nexus3
點(diǎn)擊Nexus3右上角的登錄,如圖2所示。
點(diǎn)擊后會(huì)彈出如圖3所示的提示框。
根據(jù)提示得知,初始密碼的存放位置為/nexus-data/admin.password,因?yàn)槲覀冊(cè)趩?dòng)Nexus3容器時(shí),將Nexus3容器的/nexus-data目錄映射到了宿主機(jī)的/usr/local/nexus-data目錄,所以,我們?cè)谒拗鳈C(jī)的/usr/local/nexus-data目錄中也能夠查詢到admin.password文件。
所以,在宿主機(jī)中輸入如下命令即可查看到admin.password文件。
ll /usr/local/nexus-data
具體如圖4所示。
輸入如下命令查看admin.password文件的內(nèi)容。
[root@binghe102 ~]# cat /usr/local/nexus-data/admin.password
517842df-1a2d-49c9-b4c3-b9ad4cf0fe00
此時(shí),我們就查看到登錄Nexus3的admin賬號(hào)的密碼為517842df-1a2d-49c9-b4c3-b9ad4cf0fe00,將admin賬號(hào)和對(duì)應(yīng)的密碼輸入到圖3所示的提示框中,即可登錄Nexus3,如圖5所示。
登錄后的界面如圖6所示。
可以看到,首次登錄后會(huì)自動(dòng)彈出完成必要設(shè)置的提示框,點(diǎn)擊Next按鈕,設(shè)置新密碼,如圖7所示。
這里,自行記錄新設(shè)置的密碼,用于后續(xù)登錄Nexus。
點(diǎn)擊Next按鈕,選擇nable anonymous access,如圖8所示。
點(diǎn)擊Next按鈕,如圖9所示。
點(diǎn)擊Finish按鈕,即可完成設(shè)置。
3、配置阿里云代理倉(cāng)庫(kù)
Nexus默認(rèn)使用的遠(yuǎn)程倉(cāng)庫(kù)為maven-central,從這個(gè)遠(yuǎn)程倉(cāng)庫(kù)下載依賴很慢,經(jīng)常連不上,如圖10所示。
鼠標(biāo)單機(jī)maven-central倉(cāng)庫(kù),查看maven-central倉(cāng)庫(kù)配置的遠(yuǎn)程鏈接,如圖11所示。
可以看到,maven-central倉(cāng)庫(kù)配置的遠(yuǎn)程鏈接為https://repo1.maven.org/maven2/,從這個(gè)遠(yuǎn)程倉(cāng)庫(kù)下載依賴很慢,經(jīng)常連不上,所有我們需要配置阿里云遠(yuǎn)程代理倉(cāng)庫(kù)。
回到圖10所示的頁(yè)面,點(diǎn)擊Create repository按鈕,如圖12所示。
點(diǎn)擊后進(jìn)入選擇倉(cāng)庫(kù)類型的頁(yè)面,這里我們選擇maven2(proxy)類型,如圖13所示。
點(diǎn)擊選則maven2(proxy)類型后,進(jìn)入配置遠(yuǎn)程代理倉(cāng)庫(kù)的頁(yè)面,如圖14所示。
其中,每個(gè)配置項(xiàng)如下所示。
- Name:aliyun-central
- Version policy:Release
- Layout policy:Strict
- Remote storage:http://maven.aliyun.com/nexus/content/groups/public
接下來,拖動(dòng)3-14頁(yè)面右側(cè)的滾動(dòng)條,滑到最下面,點(diǎn)擊Create repository按鈕,如圖15所示。
點(diǎn)擊Create repository按鈕后,就可以在Repositories列表中看到新配置的阿里云代理倉(cāng)庫(kù)了,如圖16所示。
并且Status顯示的是Online - Ready to connect,說明阿里云遠(yuǎn)程倉(cāng)庫(kù)配置成功。
4、配置倉(cāng)庫(kù)組
接下來,需要將aliyun-central配置到倉(cāng)庫(kù)組,并且將aliyun-central排在maven-central上面。具體步驟如下所示。
在Repositories列表中,點(diǎn)擊maven-public,如圖17所示。
點(diǎn)擊后進(jìn)入如圖18所示的頁(yè)面。
下拉頁(yè)面右側(cè)的滾動(dòng)條,找到如圖19所示的配置。
將aliyun-central移動(dòng)到右側(cè),并排在最上面,如圖20所示。
點(diǎn)擊Save按鈕保存配置。
5、創(chuàng)建用戶
接下來,創(chuàng)建一個(gè)用于上傳Jar包到倉(cāng)庫(kù)的用戶,具體步驟如下所示。
點(diǎn)擊Security菜單下的Users菜單,如圖21所示。
點(diǎn)擊Users菜單后,點(diǎn)擊Create local user按鈕,如圖22所示。
隨后,按照?qǐng)D23所示設(shè)置用戶的基本信息。
這里,自行記錄用戶的密碼,用于后續(xù)上傳jar文件使用,配置好之后,點(diǎn)擊底部的Create local user按鈕即可。點(diǎn)擊后在Security菜單下的Users菜單的用戶列表中,可以查看到新創(chuàng)建的本地用戶,如圖24所示。
至此,Nexus3配置完畢。
五、配置本地Maven倉(cāng)庫(kù)
配置完Nexus后,接下來,還需要對(duì)本地的Maven倉(cāng)庫(kù)進(jìn)行配置,主要就是對(duì)Maven的的settings.xml文件進(jìn)行配置。
1、復(fù)制settings文件
復(fù)制setting.xml文件為setting-binghe.xml文件,如圖25所示。
2、配置servers節(jié)點(diǎn)
在settings-binghe.xml文件中,找到servers節(jié)點(diǎn),在servers節(jié)點(diǎn)中,配置5.5節(jié)創(chuàng)建的用戶,如下所示。
<server>
<id>binghe</id>
<username>binghe</username>
<password>binghe123</password>
</server>
3、配置mirrors節(jié)點(diǎn)
在settings-binghe.xml文件中,找到mirrors節(jié)點(diǎn),在mirrors節(jié)點(diǎn)中,配置倉(cāng)庫(kù)地址,如下所示。
<!--本地私服倉(cāng)庫(kù)地址-->
<mirror>
<id>central</id>
<name>Local Repository</name>
<url>http://192.168.106.102:8081/repository/maven-public</url>
<mirrorOf>*</mirrorOf>
</mirror>
<!--阿里云倉(cāng)庫(kù)地址-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4、配置profiles節(jié)點(diǎn)
在settings-binghe.xml文件中,找到profiles節(jié)點(diǎn),在profiles節(jié)點(diǎn)中,配置倉(cāng)庫(kù)信息,如下所示。
<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私服倉(cāng)庫(kù)搭建完畢,并且本地Maven也已經(jīng)配置完畢。
后續(xù)使用Maven構(gòu)建項(xiàng)目時(shí),指定使用binghe-settings.xml文件即可將依賴的Jar文件和生成的Jar文件上傳到Maven私服倉(cāng)庫(kù),如果使用IDEA編譯項(xiàng)目,也需要在IDEA中,將Maven的配置文件指定為settings-binghe.xml。
注意:我已經(jīng)將settings-binghe.xml文件上傳到本節(jié)對(duì)應(yīng)源碼分支的environment/maven目錄下,大家自行獲取即可。
六、項(xiàng)目pom.xml配置
搭建完Maven私服倉(cāng)庫(kù),配置好本地Maven倉(cāng)庫(kù)后,還需要在項(xiàng)目的pom.xml文件中進(jìn)行相應(yīng)的配置,具體如下所示。
<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>
<!--發(fā)布代碼Jar插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!--發(fā)布源碼插件 -->
<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節(jié)點(diǎn)配置的用戶ID一直,這樣才能使用配置的用戶去上傳到maven私有倉(cāng)庫(kù) -->
<!--此倉(cāng)庫(kù)對(duì)應(yīng)的為RELEASE版本的jar-->
<id>binghe</id>
<url>http://192.168.106.102:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<!--這里的id與settings.xml中的servers節(jié)點(diǎn)配置的用戶ID一直,這樣才能使用配置的用戶去上傳到maven私有倉(cāng)庫(kù) -->
<!--此倉(cāng)庫(kù)對(duì)應(yīng)的為SNAPSHOT版本的jar-->
<id>binghe</id>
<url>http://192.168.106.102:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
是不是很簡(jiǎn)單?你照著文章一步步實(shí)操,就可以基于Docker搭建屬于自己的Maven私服倉(cāng)庫(kù)了。
七、寫在最后
這些真實(shí)場(chǎng)景的項(xiàng)目設(shè)計(jì)與落地實(shí)現(xiàn),在冰河的知識(shí)星球除了分布式IM即時(shí)通訊系統(tǒng)外,還有其他5個(gè)項(xiàng)目,這些項(xiàng)目的需求、方案、架構(gòu)、落地等均來自互聯(lián)網(wǎng)真實(shí)業(yè)務(wù)場(chǎng)景,讓你真正學(xué)到互聯(lián)網(wǎng)大廠的業(yè)務(wù)與技術(shù)落地方案,并將其有效轉(zhuǎn)化為自己的知識(shí)儲(chǔ)備。