一文帶你弄懂Maven拉包(拉取依賴(lài)包)原理
三種倉(cāng)庫(kù)
在 Maven 中,倉(cāng)庫(kù)指的是存放代碼構(gòu)建的一個(gè)位置。從分類(lèi)上來(lái)說(shuō),Maven 倉(cāng)庫(kù)有兩種類(lèi)型,分別是:
- 本地倉(cāng)庫(kù)(Local)
- 遠(yuǎn)程倉(cāng)庫(kù)(Remote)
本地倉(cāng)庫(kù),是存在于本地的一個(gè)倉(cāng)庫(kù),它用來(lái)緩存下載的依賴(lài)包。這樣就不用每次都通過(guò)網(wǎng)絡(luò)去拉取依賴(lài)包了,提高了依賴(lài)?yán)∷俣?,減輕了倉(cāng)庫(kù)服務(wù)器的壓力。
遠(yuǎn)程倉(cāng)庫(kù),如其名字所述,其實(shí)位于遠(yuǎn)程服務(wù)器的一個(gè)倉(cāng)庫(kù)。例如有些公司自己對(duì)外開(kāi)放了一些 API,需要將這些 API 的依賴(lài)開(kāi)放出去,這時(shí)候就可以將 API 的 Jar 包放到公司自己的遠(yuǎn)程倉(cāng)庫(kù)中。公司的客戶(hù)可以通過(guò)連接該倉(cāng)庫(kù)下載 Jar 包。例如你們公司開(kāi)發(fā)了自己的基礎(chǔ)工具類(lèi),并將其打成了一個(gè) Jar 包。此時(shí)你可以將該 Jar 包部署到公司自己的遠(yuǎn)程倉(cāng)庫(kù)中,公司其他開(kāi)發(fā)伙伴配置該遠(yuǎn)程倉(cāng)庫(kù),從而可以拉取到該 Jar 包依賴(lài)。
在網(wǎng)上其他資料中,還會(huì)提到 Maven 倉(cāng)庫(kù)有另一個(gè)類(lèi)型 —— 中央倉(cāng)庫(kù)(Central)。但在我看來(lái),中央倉(cāng)庫(kù)其實(shí)是一個(gè)特殊的遠(yuǎn)程倉(cāng)庫(kù)。 它的特殊之處在于,它是 Maven 官方提供的,其中包括了大量常用的庫(kù),基本上大多數(shù)的依賴(lài)包都可以在這里找到。另外一個(gè)特殊之處在于,中央倉(cāng)庫(kù)的地址是內(nèi)置在 Maven 源碼中的,即默認(rèn)會(huì)向中央倉(cāng)庫(kù)拉取依賴(lài),這個(gè)在后續(xù)的依賴(lài)搜索順序中會(huì)講到。
而我們經(jīng)常說(shuō)的私服,其實(shí)也是一個(gè)特殊的遠(yuǎn)程倉(cāng)庫(kù),其特殊之處在于:它只對(duì)公司內(nèi)部開(kāi)放,方便存放一些本團(tuán)隊(duì)創(chuàng)建的開(kāi)發(fā)庫(kù)。我們經(jīng)常說(shuō)的阿里云 Maven 庫(kù),其實(shí)就是一個(gè)遠(yuǎn)程倉(cāng)庫(kù),只不過(guò)其是對(duì)所有人開(kāi)放罷了。
依賴(lài)搜索順序
弄懂了倉(cāng)庫(kù)的類(lèi)型,我們繼續(xù)來(lái)了解下依賴(lài)的搜索順序。
我們?cè)陂_(kāi)發(fā)過(guò)程中找不到依賴(lài)包,有多種原因,例如:
- 依賴(lài)包確實(shí)沒(méi)有放到遠(yuǎn)程倉(cāng)庫(kù)
- 倉(cāng)庫(kù)配置有問(wèn)題
- 等等
為了弄清楚到底是什么原因?qū)е乱蕾?lài)找不到,我們需要了解 Maven 是如何找一個(gè)依賴(lài)的。簡(jiǎn)單來(lái)說(shuō),Maven 搜索依賴(lài)的算法如下:
- 首先,在本地倉(cāng)庫(kù)搜索,如果找不到則繼續(xù)下一步。
- 接著,在中央倉(cāng)庫(kù)搜索,如果找不到則繼續(xù)下一步。
- 最后,在遠(yuǎn)程倉(cāng)庫(kù)中搜索,如果找不到則拋出錯(cuò)誤。如果沒(méi)有設(shè)置遠(yuǎn)程倉(cāng)庫(kù),那么拋出錯(cuò)誤。如果找到了依賴(lài),那么就下載到本地倉(cāng)庫(kù)緩存。
簡(jiǎn)單地說(shuō),Maven 搜索遵循簡(jiǎn)單的順序 —— 本地倉(cāng)庫(kù) -> 中央倉(cāng)庫(kù) -> 遠(yuǎn)程倉(cāng)庫(kù)
。弄明白了這個(gè)依賴(lài)搜索順序,可以幫助我們更好地排查問(wèn)題。但這可能還不夠,我們還需要搞清楚 Maven setting.xml
中的一些配置信息,從而可以排查是否是配置出現(xiàn)了問(wèn)題。例如:有時(shí)候我們配置了 mirror 鏡像,會(huì)把對(duì)某個(gè)倉(cāng)庫(kù)的請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)倉(cāng)庫(kù),這時(shí)候你要是不懂 mirror 配置,你就找不到問(wèn)題所在了。
配置信息
關(guān)于倉(cāng)庫(kù)的一些常見(jiàn)的配置項(xiàng)有:
- repositories
- mirror
- server
- 等等
下面我們將一個(gè)個(gè)講解他們的作用。
repositories 標(biāo)簽
repositories 標(biāo)簽用于定義遠(yuǎn)程倉(cāng)庫(kù),其配置范例如下所示:
<repositories> <repository> <!--公司鏡像的唯一標(biāo)識(shí),這個(gè)配置要注意,不能與mirrorOf配置的相同,不然會(huì)被攔截,重定向到外網(wǎng)的鏡像倉(cāng)庫(kù) --> <id>nexus</id> <!--倉(cāng)庫(kù)描述,隨意寫(xiě) --> <name>xxxx</name> <!-- 公司私有倉(cāng)庫(kù)地址,這個(gè)很重要不能錯(cuò)--> <url>http://xxx:8081/nexus/content/groups/public</url> <!-- 是否開(kāi)啟 releases 包的下載及更新策略 --> <releases> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> </releases> <!-- 是否開(kāi)啟 snapshots 包的下載及更新策略 --> <snapshots> <enabled>false</enabled> <checksumPolicy>warn</checksumPolicy> </snapshots> <layout>default</layout> </repository> </repositories>
repositories 標(biāo)簽既可以在 setting.xml
文件配置,也可以在 pom.xml
文件中配置。Maven 在拉取依賴(lài)的時(shí)候,是按照聲明的順序從上到下去對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù)拉取依賴(lài)的。
mirror 標(biāo)簽
mirror 標(biāo)簽用于定義倉(cāng)庫(kù)鏡像,其相當(dāng)于一個(gè)攔截器。當(dāng) mirror 的 mirrorOf
值與 repository 的 id
相同時(shí),repository 定義的倉(cāng)庫(kù)會(huì)被攔截,轉(zhuǎn)而使用 mirror 中定義的倉(cāng)庫(kù)地址。配置范例如下:
<!--使用xx公司私有倉(cāng)庫(kù)替換Maven默認(rèn)的中央倉(cāng)庫(kù) --> <mirrors> <mirror> <!--自己公司的鏡像的唯一標(biāo)識(shí),在mirror標(biāo)簽中,其實(shí)沒(méi)啥用:如xiaoyaziyun --> <id>xiaoyaziyun</id> <!--倉(cāng)庫(kù)描述,隨意寫(xiě) --> <name>xx公司私有倉(cāng)庫(kù)地址</name> <!--xx公司私有倉(cāng)庫(kù)地址,這個(gè)很重要不能錯(cuò)--> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <!--`central`為Maven中央倉(cāng)庫(kù)的標(biāo)識(shí),替換Maven源碼內(nèi)默認(rèn)的是中央倉(cāng)庫(kù)地址--> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
如上圖配置所示,Maven 會(huì)用 http://maven.aliyun.com/nexus/content/groups/public/
這個(gè)倉(cāng)庫(kù)鏡像替換 Maven 中央倉(cāng)庫(kù),其中 central
是 Maven 中央倉(cāng)庫(kù)的 ID 標(biāo)識(shí)。我們經(jīng)常說(shuō)用阿里云的 Maven 倉(cāng)庫(kù)可以提速,其實(shí)就是使用這種方法實(shí)現(xiàn)的。
server 標(biāo)簽
大部分遠(yuǎn)程倉(cāng)庫(kù)無(wú)須認(rèn)證就可以訪(fǎng)問(wèn),但我們自己搭建的 Maven 倉(cāng)庫(kù),處于安全方面的考慮,我們會(huì)設(shè)置訪(fǎng)問(wèn)權(quán)限。此時(shí),我們需要在 setting.xml
文件中配置 server標(biāo)簽。配置示例如下代碼所示:
<settings> <!--配置遠(yuǎn)程倉(cāng)庫(kù)認(rèn)證信息--> <servers> <server> <id>shuyi-tech-repo</id> <username>admin</username> <password>admin123</password> </server> </servers> </settings>
上面的配置為 repository id 為 shuyi-tech-repo
的遠(yuǎn)程倉(cāng)庫(kù)配置了用戶(hù)名和密碼,其中用戶(hù)名為 admin
,密碼為 admin123
。這里通過(guò) server.id
與 reposiroty.id
標(biāo)簽將認(rèn)證信息與倉(cāng)庫(kù)綁定在一起,因此在配置的時(shí)候需要保持這兩個(gè)信息一致,否則可能導(dǎo)致訪(fǎng)問(wèn)失敗。
其他標(biāo)簽
proxy
標(biāo)簽:服務(wù)器不能直接訪(fǎng)問(wèn)外網(wǎng)時(shí)需要設(shè)置的代理服務(wù),不常用。
profiles
標(biāo)簽:上面提到mirror
,配置多個(gè)只會(huì)一個(gè)有效,如果需要多倉(cāng)庫(kù)配置,可以在profiles節(jié)點(diǎn)下配置多個(gè)profile,但是配置需要激活,特別麻煩,也不常用。
配置文件優(yōu)先級(jí)
對(duì)于 Maven 來(lái)說(shuō),我們會(huì)看到有多個(gè)配置文件:
- 項(xiàng)目 pom.xml 文件
.m2/settings.xml
文件- Maven 安裝目錄
/conf/settings.xml
文件
如果一個(gè)配置同時(shí)存在于多個(gè)位置,那么到底以哪個(gè)為準(zhǔn)呢?簡(jiǎn)單地說(shuō),這幾個(gè)配置文件的優(yōu)先級(jí)是怎樣的呢?如果沒(méi)搞懂這個(gè)問(wèn)題,那么我們排查問(wèn)題的時(shí)候可能會(huì)一團(tuán)糟。
其實(shí)三者的優(yōu)先級(jí)是 pom.xml
>/用戶(hù)/.m2/settings.xml
>/maven安裝目錄/conf/settings.xml
。如果要設(shè)置全局 Maven 倉(cāng)庫(kù)配置,需要在 Maven 安裝目錄 /conf
下找到 settings.xml
來(lái)修改。
以上就是一文帶你弄懂Maven拉包(拉取依賴(lài)包)原理的詳細(xì)內(nèi)容,更多關(guān)于Maven拉包原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java使用PageInfo的list通用分頁(yè)處理demo
這篇文章主要為大家介紹了java使用PageInfo的list通用分頁(yè)處理demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2023-12-12Java實(shí)現(xiàn)局域網(wǎng)聊天小程序
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)局域網(wǎng)聊天小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05sharding-jdbc讀寫(xiě)分離原理詳細(xì)解析
這篇文章主要介紹了sharding-jdbc讀寫(xiě)分離原理詳細(xì)解析,很多時(shí)候,為了應(yīng)付DB的高并發(fā)讀寫(xiě),我們會(huì)采用讀寫(xiě)分離技術(shù),讀寫(xiě)分離指的是利用數(shù)據(jù)庫(kù)主從技術(shù)(把數(shù)據(jù)復(fù)制到多個(gè)節(jié)點(diǎn)中),分散讀多個(gè)庫(kù)以支持高并發(fā)的讀,需要的朋友可以參考下2023-12-12Java反射設(shè)置/獲取對(duì)象屬性值三種方式
這篇文章主要給大家介紹了關(guān)于Java反射設(shè)置/獲取對(duì)象屬性值的三種方式,反射機(jī)制的用途非常多,比如獲取方法,屬性名和屬性值等,甚至可以獲取標(biāo)簽等標(biāo)簽屬性,需要的朋友可以參考下2023-11-11Springboot @Configuration @bean注解作用解析
這篇文章主要介紹了springboot @Configuration @bean注解作用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02