偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一文帶你弄懂 Maven 拉包原理

開發(fā) 架構(gòu)
遠(yuǎn)程倉(cāng)庫(kù),如其名字所述,其實(shí)位于遠(yuǎn)程服務(wù)器的一個(gè)倉(cāng)庫(kù)。例如有些公司自己對(duì)外開放了一些 API,需要將這些 API 的依賴開放出去,這時(shí)候就可以將 API 的 Jar 包放到公司自己的遠(yuǎn)程倉(cāng)庫(kù)中。

業(yè)務(wù)需求開發(fā)的時(shí)候,我們總是會(huì)遇到拉不到依賴包的情況。此時(shí)如果不清楚 Maven 拉取依賴包的原理,那么很可能找不到問題所在。今天樹哥就帶大家了解下 Maven 拉包的原理,讓你在遇到問題的時(shí)候能快速解決!

三種倉(cāng)庫(kù)

在 Maven 中,倉(cāng)庫(kù)指的是存放代碼構(gòu)建的一個(gè)位置。從分類上來說,Maven 倉(cāng)庫(kù)有兩種類型,分別是:

  • 本地倉(cāng)庫(kù)(Local)
  • 遠(yuǎn)程倉(cāng)庫(kù)(Remote)

本地倉(cāng)庫(kù),是存在于本地的一個(gè)倉(cāng)庫(kù),它用來緩存下載的依賴包。這樣就不用每次都通過網(wǎng)絡(luò)去拉取依賴包了,提高了依賴?yán)∷俣?,減輕了倉(cāng)庫(kù)服務(wù)器的壓力。

遠(yuǎn)程倉(cāng)庫(kù),如其名字所述,其實(shí)位于遠(yuǎn)程服務(wù)器的一個(gè)倉(cāng)庫(kù)。例如有些公司自己對(duì)外開放了一些 API,需要將這些  API 的依賴開放出去,這時(shí)候就可以將 API 的 Jar 包放到公司自己的遠(yuǎn)程倉(cāng)庫(kù)中。

公司的客戶可以通過連接該倉(cāng)庫(kù)下載 Jar 包。例如你們公司開發(fā)了自己的基礎(chǔ)工具類,并將其打成了一個(gè) Jar 包。此時(shí)你可以將該 Jar 包部署到公司自己的遠(yuǎn)程倉(cāng)庫(kù)中,公司其他開發(fā)伙伴配置該遠(yuǎn)程倉(cāng)庫(kù),從而可以拉取到該 Jar 包依賴。

在網(wǎng)上其他資料中,還會(huì)提到 Maven 倉(cāng)庫(kù)有另一個(gè)類型 —— 中央倉(cāng)庫(kù)(Central)。但在我看來,中央倉(cāng)庫(kù)其實(shí)是一個(gè)特殊的遠(yuǎn)程倉(cāng)庫(kù)。 

它的特殊之處在于,它是 Maven 官方提供的,其中包括了大量常用的庫(kù),基本上大多數(shù)的依賴包都可以在這里找到。另外一個(gè)特殊之處在于,中央倉(cāng)庫(kù)的地址是內(nèi)置在 Maven 源碼中的,即默認(rèn)會(huì)向中央倉(cāng)庫(kù)拉取依賴,這個(gè)在后續(xù)的依賴搜索順序中會(huì)講到。

而我們經(jīng)常說的私服,其實(shí)也是一個(gè)特殊的遠(yuǎn)程倉(cāng)庫(kù),其特殊之處在于:它只對(duì)公司內(nèi)部開放,方便存放一些本團(tuán)隊(duì)創(chuàng)建的開發(fā)庫(kù)。我們經(jīng)常說的阿里云 Maven 庫(kù),其實(shí)就是一個(gè)遠(yuǎn)程倉(cāng)庫(kù),只不過其是對(duì)所有人開放罷了。

依賴搜索順序

弄懂了倉(cāng)庫(kù)的類型,我們繼續(xù)來了解下依賴的搜索順序。

我們?cè)陂_發(fā)過程中找不到依賴包,有多種原因,例如:

  • 依賴包確實(shí)沒有放到遠(yuǎn)程倉(cāng)庫(kù)
  • 倉(cāng)庫(kù)配置有問題
  • 等等

為了弄清楚到底是什么原因?qū)е乱蕾囌也坏?,我們需要了?Maven 是如何找一個(gè)依賴的。簡(jiǎn)單來說,Maven 搜索依賴的算法如下:

  1. 首先,在本地倉(cāng)庫(kù)搜索,如果找不到則繼續(xù)下一步。
  2. 接著,在中央倉(cāng)庫(kù)搜索,如果找不到則繼續(xù)下一步。
  3. 最后,在遠(yuǎn)程倉(cāng)庫(kù)中搜索,如果找不到則拋出錯(cuò)誤。如果沒有設(shè)置遠(yuǎn)程倉(cāng)庫(kù),那么拋出錯(cuò)誤。如果找到了依賴,那么就下載到本地倉(cāng)庫(kù)緩存。

簡(jiǎn)單地說,Maven 搜索遵循簡(jiǎn)單的順序 —— 本地倉(cāng)庫(kù) -> 中央倉(cāng)庫(kù) -> 遠(yuǎn)程倉(cāng)庫(kù)?。弄明白了這個(gè)依賴搜索順序,可以幫助我們更好地排查問題。但這可能還不夠,我們還需要搞清楚 Maven  setting.xml 中的一些配置信息,從而可以排查是否是配置出現(xiàn)了問題。例如:有時(shí)候我們配置了 mirror 鏡像,會(huì)把對(duì)某個(gè)倉(cāng)庫(kù)的請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)倉(cāng)庫(kù),這時(shí)候你要是不懂 mirror 配置,你就找不到問題所在了。

配置信息

關(guān)于倉(cāng)庫(kù)的一些常見的配置項(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ù)描述,隨意寫 -->
<name>xxxx</name>
<!-- 公司私有倉(cāng)庫(kù)地址,這個(gè)很重要不能錯(cuò)-->
<url>http://xxx:8081/nexus/content/groups/public</url>
<!-- 是否開啟 releases 包的下載及更新策略 -->
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<!-- 是否開啟 snapshots 包的下載及更新策略 -->
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
</repositories>

repositories 標(biāo)簽既可以在 setting.xml? 文件配置,也可以在 pom.xml 文件中配置。Maven 在拉取依賴的時(shí)候,是按照聲明的順序從上到下去對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù)拉取依賴的。

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í)沒啥用:如xiaoyaziyun -->
<id>xiaoyaziyun</id>
<!--倉(cāng)庫(kù)描述,隨意寫 -->
<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)常說用阿里云的 Maven 倉(cāng)庫(kù)可以提速,其實(shí)就是使用這種方法實(shí)現(xiàn)的。

server 標(biāo)簽

大部分遠(yuǎn)程倉(cāng)庫(kù)無須認(rèn)證就可以訪問,但我們自己搭建的 Maven 倉(cāng)庫(kù),處于安全方面的考慮,我們會(huì)設(shè)置訪問權(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ù)配置了用戶名和密碼,其中用戶名為 admin?,密碼為 admin123?。這里通過 server.id? 與 reposiroty.id 標(biāo)簽將認(rèn)證信息與倉(cāng)庫(kù)綁定在一起,因此在配置的時(shí)候需要保持這兩個(gè)信息一致,否則可能導(dǎo)致訪問失敗。

其他標(biāo)簽

  • proxy 標(biāo)簽:服務(wù)器不能直接訪問外網(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 來說,我們會(huì)看到有多個(gè)配置文件:

  • 項(xiàng)目 pom.xml 文件
  • .m2/settings.xml 文件
  • Maven 安裝目錄 /conf/settings.xml 文件

如果一個(gè)配置同時(shí)存在于多個(gè)位置,那么到底以哪個(gè)為準(zhǔn)呢?簡(jiǎn)單地說,這幾個(gè)配置文件的優(yōu)先級(jí)是怎樣的呢?如果沒搞懂這個(gè)問題,那么我們排查問題的時(shí)候可能會(huì)一團(tuán)糟。

其實(shí)三者的級(jí)先是  **pom.xml? >/用戶/.m2/settings.xml>/maven安裝目錄/conf/settings.xml?**。如果要設(shè)置全局 Maven 倉(cāng)庫(kù)配置,需要在 Maven 安裝目錄 /conf? 下找到 settings.xml 來修改。

參考資料

  • VIP?。》浅2诲e(cuò)!Nexus 倉(cāng)庫(kù)屬性和分類
  • Maven 倉(cāng)庫(kù) | 菜鳥教程
  • VIP!!寫得很全面!Maven 遠(yuǎn)程倉(cāng)庫(kù)的各種配置_kaixin201505 的博客 - CSDN 博客_maven 遠(yuǎn)程倉(cāng)庫(kù)配置
  • Maven 的遠(yuǎn)程倉(cāng)庫(kù)配置說明 - 簡(jiǎn)書
  • VIP!關(guān)于 Mirror 的講解,圖文并茂!Mirror 的詳細(xì)說明_蒼煜的博客 - CSDN 博客_maven mirror
  • (26 條消息) Maven 配置遠(yuǎn)程倉(cāng)庫(kù)_mvn 遠(yuǎn)程倉(cāng)庫(kù)_ihaveadream 丶的博客 - CSDN 博客

責(zé)任編輯:武曉燕 來源: 樹哥聊編程
相關(guān)推薦

2022-08-03 08:01:16

CDN網(wǎng)站服務(wù)器

2023-12-12 07:31:51

Executors工具開發(fā)者

2023-09-18 08:02:45

CSS布局屬性

2023-10-26 16:27:50

前端 WebCSS開發(fā)

2023-03-30 08:52:40

DartFlutter

2023-03-27 17:58:34

MySQL加鎖間隙鎖

2022-09-05 09:25:53

KubernetesService

2022-09-09 10:00:13

KubernetesConfigMap

2024-10-16 10:11:52

2021-06-02 05:43:36

比特幣虛擬貨幣區(qū)塊鏈

2023-11-28 09:31:55

MySQL算法

2022-08-09 09:10:43

Kubernetes容器

2022-09-01 08:01:56

Pythongunicorn

2024-05-09 10:11:30

2020-03-18 13:40:03

Spring事數(shù)據(jù)庫(kù)代碼

2023-07-31 08:18:50

Docker參數(shù)容器

2021-05-29 10:11:00

Kafa數(shù)據(jù)業(yè)務(wù)

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2023-11-20 08:18:49

Netty服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)