掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
業(yè)務(wù)需求開發(fā)的時(shí)候,我們總是會(huì)遇到拉不到依賴包的情況。此時(shí)如果不清楚 Maven 拉取依賴包的原理,那么很可能找不到問題所在。今天樹哥就帶大家了解下 Maven 拉包的原理,讓你在遇到問題的時(shí)候能快速解決!

永安ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
在 Maven 中,倉庫指的是存放代碼構(gòu)建的一個(gè)位置。從分類上來說,Maven 倉庫有兩種類型,分別是:
本地倉庫,是存在于本地的一個(gè)倉庫,它用來緩存下載的依賴包。這樣就不用每次都通過網(wǎng)絡(luò)去拉取依賴包了,提高了依賴?yán)∷俣?,減輕了倉庫服務(wù)器的壓力。
遠(yuǎn)程倉庫,如其名字所述,其實(shí)位于遠(yuǎn)程服務(wù)器的一個(gè)倉庫。例如有些公司自己對外開放了一些 API,需要將這些 API 的依賴開放出去,這時(shí)候就可以將 API 的 Jar 包放到公司自己的遠(yuǎn)程倉庫中。
公司的客戶可以通過連接該倉庫下載 Jar 包。例如你們公司開發(fā)了自己的基礎(chǔ)工具類,并將其打成了一個(gè) Jar 包。此時(shí)你可以將該 Jar 包部署到公司自己的遠(yuǎn)程倉庫中,公司其他開發(fā)伙伴配置該遠(yuǎn)程倉庫,從而可以拉取到該 Jar 包依賴。
在網(wǎng)上其他資料中,還會(huì)提到 Maven 倉庫有另一個(gè)類型 —— 中央倉庫(Central)。但在我看來,中央倉庫其實(shí)是一個(gè)特殊的遠(yuǎn)程倉庫。
它的特殊之處在于,它是 Maven 官方提供的,其中包括了大量常用的庫,基本上大多數(shù)的依賴包都可以在這里找到。另外一個(gè)特殊之處在于,中央倉庫的地址是內(nèi)置在 Maven 源碼中的,即默認(rèn)會(huì)向中央倉庫拉取依賴,這個(gè)在后續(xù)的依賴搜索順序中會(huì)講到。
而我們經(jīng)常說的私服,其實(shí)也是一個(gè)特殊的遠(yuǎn)程倉庫,其特殊之處在于:它只對公司內(nèi)部開放,方便存放一些本團(tuán)隊(duì)創(chuàng)建的開發(fā)庫。我們經(jīng)常說的阿里云 Maven 庫,其實(shí)就是一個(gè)遠(yuǎn)程倉庫,只不過其是對所有人開放罷了。
弄懂了倉庫的類型,我們繼續(xù)來了解下依賴的搜索順序。
我們在開發(fā)過程中找不到依賴包,有多種原因,例如:
為了弄清楚到底是什么原因?qū)е乱蕾囌也坏剑覀冃枰私?Maven 是如何找一個(gè)依賴的。簡單來說,Maven 搜索依賴的算法如下:
簡單地說,Maven 搜索遵循簡單的順序 —— 本地倉庫 -> 中央倉庫 -> 遠(yuǎn)程倉庫?。弄明白了這個(gè)依賴搜索順序,可以幫助我們更好地排查問題。但這可能還不夠,我們還需要搞清楚 Maven setting.xml 中的一些配置信息,從而可以排查是否是配置出現(xiàn)了問題。例如:有時(shí)候我們配置了 mirror 鏡像,會(huì)把對某個(gè)倉庫的請求轉(zhuǎn)發(fā)到另一個(gè)倉庫,這時(shí)候你要是不懂 mirror 配置,你就找不到問題所在了。
關(guān)于倉庫的一些常見的配置項(xiàng)有:
下面我們將一個(gè)個(gè)講解他們的作用。
repositories 標(biāo)簽用于定義遠(yuǎn)程倉庫,其配置范例如下所示:
nexus
xxxx
http://xxx:8081/nexus/content/groups/public
true
daily
false
warn
default
repositories 標(biāo)簽既可以在 setting.xml? 文件配置,也可以在 pom.xml 文件中配置。Maven 在拉取依賴的時(shí)候,是按照聲明的順序從上到下去對應(yīng)的遠(yuǎn)程倉庫拉取依賴的。
mirror 標(biāo)簽用于定義倉庫鏡像,其相當(dāng)于一個(gè)攔截器。當(dāng) mirror 的 mirrorOf? 值與 repository 的 id 相同時(shí),repository 定義的倉庫會(huì)被攔截,轉(zhuǎn)而使用 mirror 中定義的倉庫地址。配置范例如下:
xiaoyaziyun
xx公司私有倉庫地址
http://maven.aliyun.com/nexus/content/groups/public/
central
如上圖配置所示,Maven 會(huì)用 http://maven.aliyun.com/nexus/content/groups/public/? 這個(gè)倉庫鏡像替換 Maven 中央倉庫,其中 central 是 Maven 中央倉庫的 ID 標(biāo)識(shí)。我們經(jīng)常說用阿里云的 Maven 倉庫可以提速,其實(shí)就是使用這種方法實(shí)現(xiàn)的。
大部分遠(yuǎn)程倉庫無須認(rèn)證就可以訪問,但我們自己搭建的 Maven 倉庫,處于安全方面的考慮,我們會(huì)設(shè)置訪問權(quán)限。此時(shí),我們需要在 setting.xml 文件中配置 server 標(biāo)簽。配置示例如下代碼所示:
shuyi-tech-repo
admin
admin123
上面的配置為 repository id 為 shuyi-tech-repo? 的遠(yuǎn)程倉庫配置了用戶名和密碼,其中用戶名為 admin?,密碼為 admin123?。這里通過 server.id? 與 reposiroty.id 標(biāo)簽將認(rèn)證信息與倉庫綁定在一起,因此在配置的時(shí)候需要保持這兩個(gè)信息一致,否則可能導(dǎo)致訪問失敗。
對于 Maven 來說,我們會(huì)看到有多個(gè)配置文件:
如果一個(gè)配置同時(shí)存在于多個(gè)位置,那么到底以哪個(gè)為準(zhǔn)呢?簡單地說,這幾個(gè)配置文件的優(yōu)先級是怎樣的呢?如果沒搞懂這個(gè)問題,那么我們排查問題的時(shí)候可能會(huì)一團(tuán)糟。
其實(shí)三者的級先是 **pom.xml? >/用戶/.m2/settings.xml>/maven安裝目錄/conf/settings.xml?**。如果要設(shè)置全局 Maven 倉庫配置,需要在 Maven 安裝目錄 /conf? 下找到 settings.xml 來修改。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流