一文帶你弄懂 Maven 拉包原理
來源:樹哥聊程式設計
三種倉庫
在 Maven 中,倉庫指的是存放程式碼構建的一個位置。從分類上來說,Maven 倉庫有兩種型別,分別是:
本地倉庫(Local) 遠端倉庫(Remote)
本地倉庫,是存在於本地的一個倉庫,它用來快取下載的依賴包。這樣就不用每次都透過網路去拉取依賴包了,提高了依賴拉取速度,減輕了倉庫伺服器的壓力。
遠端倉庫,如其名字所述,其實位於遠端伺服器的一個倉庫。例如有些公司自己對外開放了一些 API,需要將這些 API 的依賴開放出去,這時候就可以將 API 的 Jar 包放到公司自己的遠端倉庫中。
公司的客戶可以透過連線該倉庫下載 Jar 包。例如你們公司開發了自己的基礎工具類,並將其打成了一個 Jar 包。此時你可以將該 Jar 包部署到公司自己的遠端倉庫中,公司其他開發夥伴配置該遠端倉庫,從而可以拉取到該 Jar 包依賴。
在網上其他資料中,還會提到 Maven 倉庫有另一個型別 —— 中央倉庫(Central)。但在我看來,中央倉庫其實是一個特殊的遠端倉庫。
它的特殊之處在於,它是 Maven 官方提供的,其中包括了大量常用的庫,基本上大多數的依賴包都可以在這裡找到。另外一個特殊之處在於,中央倉庫的地址是內建在 Maven 原始碼中的,即預設會向中央倉庫拉取依賴,這個在後續的依賴搜尋順序中會講到。
而我們經常說的私服,其實也是一個特殊的遠端倉庫,其特殊之處在於:它只對公司內部開放,方便存放一些本團隊建立的開發庫。我們經常說的阿里雲 Maven 庫,其實就是一個遠端倉庫,只不過其是對所有人開放罷了。
依賴搜尋順序
弄懂了倉庫的型別,我們繼續來了解下依賴的搜尋順序。
我們在開發過程中找不到依賴包,有多種原因,例如:
依賴包確實沒有放到遠端倉庫 倉庫配置有問題 等等
為了弄清楚到底是什麼原因導致依賴找不到,我們需要了解 Maven 是如何找一個依賴的。簡單來說,Maven 搜尋依賴的演算法如下:
首先,在本地倉庫搜尋,如果找不到則繼續下一步。 接著,在中央倉庫搜尋,如果找不到則繼續下一步。 最後,在遠端倉庫中搜尋,如果找不到則丟擲錯誤。如果沒有設定遠端倉庫,那麼丟擲錯誤。如果找到了依賴,那麼就下載到本地倉庫快取。
簡單地說,Maven 搜尋遵循簡單的順序 —— 本地倉庫 -> 中央倉庫 -> 遠端倉庫
。弄明白了這個依賴搜尋順序,可以幫助我們更好地排查問題。但這可能還不夠,我們還需要搞清楚 Maven setting.xml
中的一些配置資訊,從而可以排查是否是配置出現了問題。例如:有時候我們配置了 mirror 映象,會把對某個倉庫的請求轉發到另一個倉庫,這時候你要是不懂 mirror 配置,你就找不到問題所在了。
配置資訊
關於倉庫的一些常見的配置項有:
repositories mirror server 等等
下面我們將一個個講解他們的作用。
repositories 標籤
repositories 標籤用於定義遠端倉庫,其配置範例如下所示:
<repositories>
<repository>
<!--公司映象的唯一標識,這個配置要注意,不能與mirrorOf配置的相同,不然會被攔截,重定向到外網的映象倉庫 -->
<id>nexus</id>
<!--倉庫描述,隨意寫 -->
<name>xxxx</name>
<!-- 公司私有倉庫地址,這個很重要不能錯-->
<url></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 標籤既可以在 setting.xml
檔案配置,也可以在 pom.xml
檔案中配置。Maven 在拉取依賴的時候,是按照宣告的順序從上到下去對應的遠端倉庫拉取依賴的。
mirror 標籤
mirror 標籤用於定義倉庫映象,其相當於一個攔截器。當 mirror 的 mirrorOf
值與 repository 的 id
相同時,repository 定義的倉庫會被攔截,轉而使用 mirror 中定義的倉庫地址。配置範例如下:
<!--使用xx公司私有倉庫替換Maven預設的中央倉庫 -->
<mirrors>
<mirror>
<!--自己公司的映象的唯一標識,在mirror標籤中,其實沒啥用:如xiaoyaziyun -->
<id>xiaoyaziyun</id>
<!--倉庫描述,隨意寫 -->
<name>xx公司私有倉庫地址</name>
<!--xx公司私有倉庫地址,這個很重要不能錯-->
<url></url>
<!--`central`為Maven中央倉庫的標識,替換Maven原始碼內預設的是中央倉庫地址-->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
如上圖配置所示,Maven 會用 這個倉庫映象替換 Maven 中央倉庫,其中
central
是 Maven 中央倉庫的 ID 標識。我們經常說用阿里雲的 Maven 倉庫可以提速,其實就是使用這種方法實現的。
server 標籤
大部分遠端倉庫無須認證就可以訪問,但我們自己搭建的 Maven 倉庫,處於安全方面的考慮,我們會設定訪問許可權。此時,我們需要在 setting.xml
檔案中配置 server 標籤。配置示例如下程式碼所示:
<settings>
<!--配置遠端倉庫認證資訊-->
<servers>
<server>
<id>shuyi-tech-repo</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
上面的配置為 repository id 為 shuyi-tech-repo
的遠端倉庫配置了使用者名稱和密碼,其中使用者名稱為 admin
,密碼為 admin123
。這裡透過 server.id
與 reposiroty.id
標籤將認證資訊與倉庫繫結在一起,因此在配置的時候需要保持這兩個資訊一致,否則可能導致訪問失敗。
其他標籤
proxy
標籤:伺服器不能直接訪問外網時需要設定的代理服務,不常用。
profiles
標籤:上面提到mirror
,配置多個只會一個有效,如果需要多倉庫配置,可以在 profiles 節點下配置多個 profile,但是配置需要啟用,特別麻煩,也不常用。
配置檔案優先順序
對於 Maven 來說,我們會看到有多個配置檔案:
專案 pom.xml 檔案 .m2/settings.xml
檔案Maven 安裝目錄 /conf/settings.xml
檔案
如果一個配置同時存在於多個位置,那麼到底以哪個為準呢?簡單地說,這幾個配置檔案的優先順序是怎樣的呢?如果沒搞懂這個問題,那麼我們排查問題的時候可能會一團糟。
其實三者的級先是 **pom.xml
>/使用者/.m2/settings.xml
>/maven安裝目錄/conf/settings.xml
**。如果要設定全域性 Maven 倉庫配置,需要在 Maven 安裝目錄 /conf
下找到 settings.xml
來修改。
參考資料
VIP!!非常不錯!Nexus 倉庫屬性和分類 Maven 倉庫 | 菜鳥教程 VIP!!寫得很全面!Maven 遠端倉庫的各種配置_kaixin201505 的部落格 - CSDN 部落格_maven 遠端倉庫配置 Maven 的遠端倉庫配置說明 - 簡書 VIP!關於 Mirror 的講解,圖文並茂!Mirror 的詳細說明_蒼煜的部落格 - CSDN 部落格_maven mirror (26 條訊息) Maven 配置遠端倉庫_mvn 遠端倉庫_ihaveadream 丶的部落格 - CSDN 部落格
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2943667/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一文弄懂HTTPS加密原理HTTP加密
- 帶你徹底弄懂Event LoopOOP
- 一文帶你搞懂 CDN 的技術原理
- 一文徹底弄懂JUC工具包的Semaphore
- 梭梭帶你拉虛機
- 一文帶你掌握【TCP擁塞視窗】原理TCP
- 一文帶你瞭解執行緒池原理執行緒
- 一文徹底弄懂JUC工具包的CountDownLatch的設計理念與底層原理CountDownLatch
- 一文帶你深度解析MySQL 8.0事務提交原理MySql
- .NETCore C# 中級篇2-4 一文帶你完全弄懂正規表示式NetCoreC#
- 一文帶你懟明白程式和執行緒通訊原理執行緒
- 一文帶你深入瞭解 Redis 的持久化方式及其原理Redis持久化
- 一文弄懂“分散式鎖”分散式
- 一文弄懂 HTTP、cookie、sessionHTTPCookieSession
- 一文弄懂分散式場景中各種鎖的原理及使用分散式
- 一文帶你快速掌握AQSAQS
- 一文帶你搞懂RPCRPC
- 一文帶你認識DockerDocker
- 一文帶你入門 GolangGolang
- 一文弄懂Nginx的location匹配Nginx
- 7000字+24張圖帶你徹底弄懂執行緒池執行緒
- 一篇文章帶你弄懂Kerberos的設計思路ROS
- 徹底弄懂 JavaScript 閉包JavaScript
- 帶你理解Lock鎖原理
- 一文帶你入門LinuxLinux
- 一文帶你看清 HTTP 所有概念HTTP
- 一文帶你入門TransformerORM
- 一文帶你入門圖機器學習機器學習
- 一文徹底弄懂ArrayList原始碼原始碼
- 一文掌握Golang中IO包使用與原理Golang
- 一次性帶你弄懂java中的static關鍵字Java
- 專治各種不明白,一文帶你瞭解“對抗樣本原理”
- 一文帶你看通透,MySQL事務ACID四大特性實現原理MySql
- 一文帶你瞭解nginx基礎Nginx
- 一文帶你學習SpringBootSpring Boot
- 一文帶你看懂Spring事務!Spring
- 一文帶你瞭解HDFS技術
- 一文帶你更方便的控制 goroutineGo