Maven多倉(cāng)庫(kù)多鏡像源配置過(guò)程
一、核心概念:倉(cāng)庫(kù)(Repository)與鏡像(Mirror)
在講解配置前,需先明確兩個(gè)核心概念的區(qū)別:

二、多倉(cāng)庫(kù)配置:原理與方式
Maven 支持配置多個(gè)遠(yuǎn)程倉(cāng)庫(kù),用于獲取不同來(lái)源的依賴(例如:中央倉(cāng)庫(kù)沒(méi)有的依賴,可能在 Spring 倉(cāng)庫(kù)、Google 倉(cāng)庫(kù)中存在)。
1. 倉(cāng)庫(kù)的分類
(1)本地倉(cāng)庫(kù)
默認(rèn)位于~/.m2/repository ,所有下載的依賴都會(huì)緩存到這里,優(yōu)先從本地倉(cāng)庫(kù)獲取依賴。
(2)遠(yuǎn)程倉(cāng)庫(kù):三類
- 中央倉(cāng)庫(kù)(Maven 默認(rèn)內(nèi)置):
https://repo1.maven.org/maven2/,存儲(chǔ)大部分開源依賴。 - 第三方倉(cāng)庫(kù): 例如,Spring 倉(cāng)庫(kù)(
https://repo.spring.io/release/)、Google 倉(cāng)庫(kù)(https://maven.google.com/)等,存儲(chǔ)特定框架的依賴。 - 私有倉(cāng)庫(kù): 企業(yè)內(nèi)部搭建的倉(cāng)庫(kù)(如 Nexus、Artifactory),存儲(chǔ)內(nèi)部構(gòu)件或代理外部倉(cāng)庫(kù)。
2. 多倉(cāng)庫(kù)的配置位置
遠(yuǎn)程倉(cāng)庫(kù)的配置有兩個(gè)級(jí)別,優(yōu)先級(jí)不同:

3. 多倉(cāng)庫(kù)配置示例
(1)在pom.xml中配置項(xiàng)目級(jí)倉(cāng)庫(kù)
<project>
<!-- 其他配置 -->
<repositories>
<!-- 中央倉(cāng)庫(kù)(Maven默認(rèn)已內(nèi)置,可省略) -->
<repository>
<id>central</id>
<name>Maven Central Repository</name>
<url>https://repo1.maven.org/maven2/</url>
<releases>
<enabled>true</enabled> <!-- 允許下載release版本 -->
</releases>
<snapshots>
<enabled>false</enabled> <!-- 禁止下載snapshot版本(不穩(wěn)定) -->
</snapshots>
</repository>
<!-- Spring倉(cāng)庫(kù)(獲取Spring相關(guān)依賴) -->
<repository>
<id>spring-releases</id>
<name>Spring Releases Repository</name>
<url>https://repo.spring.io/release/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<!-- Google倉(cāng)庫(kù)(獲取Android相關(guān)依賴) -->
<repository>
<id>google</id>
<name>Google Repository</name>
<url>https://maven.google.com/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
</project>
(2)在maven安裝目錄/conf/settings.xml中配置全局級(jí)倉(cāng)庫(kù)
<settings>
<!-- 其他配置 -->
<profiles>
<profile>
<id>custom-repos</id>
<repositories>
<!-- 私有倉(cāng)庫(kù)(企業(yè)內(nèi)部依賴) -->
<repository>
<id>company-private</id>
<url>http://nexus.company.com/repository/maven-public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<!-- 其他共用倉(cāng)庫(kù) -->
</repositories>
</profile>
</profiles>
<!-- 激活上述profile,使其生效 -->
<activeProfiles>
<activeProfile>custom-repos</activeProfile>
</activeProfiles>
</settings>
4. 多倉(cāng)庫(kù)配置注意事項(xiàng)
- 倉(cāng)庫(kù) ID 唯一性: 每個(gè)倉(cāng)庫(kù)的id必須唯一(Maven 通過(guò)id識(shí)別倉(cāng)庫(kù)),否則會(huì)導(dǎo)致沖突。
- releases/snapshots開關(guān): 通過(guò)enabled控制是否允許從該倉(cāng)庫(kù)下載正式版 / 快照版依賴(快照版不穩(wěn)定,生產(chǎn)環(huán)境通常關(guān)閉)。
- 優(yōu)先級(jí): pom.xml中的倉(cāng)庫(kù)優(yōu)先級(jí)高于settings.xml,即項(xiàng)目級(jí)配置會(huì)覆蓋全局配置(如需全局生效,建議配置在settings.xml)。
三、多鏡像源配置:原理與規(guī)則
鏡像的核心作用是 “替代遠(yuǎn)程倉(cāng)庫(kù)”,當(dāng)配置多個(gè)鏡像時(shí),需通過(guò)mirrorOf屬性明確每個(gè)鏡像替代哪些倉(cāng)庫(kù),避免沖突。
1. 鏡像的配置位置
鏡像只能在settings.xml的<mirrors>標(biāo)簽中配置(全局生效),無(wú)法在pom.xml中配置(保證鏡像的全局統(tǒng)一性)。
2. 多鏡像配置的核心:mirrorOf規(guī)則
mirrorOf是鏡像配置的靈魂,用于指定 “當(dāng)前鏡像替代哪些倉(cāng)庫(kù)”,其值通過(guò)倉(cāng)庫(kù)的id匹配(倉(cāng)庫(kù)id在<repository>中定義)。常見規(guī)則如下:

3. 多鏡像配置示例
假設(shè)需求:用阿里云加速中央倉(cāng)庫(kù),用華為云加速 Spring 倉(cāng)庫(kù),同時(shí)保留私有倉(cāng)庫(kù)直接訪問(wèn)。
<settings>
<!-- 其他配置 -->
<mirrors>
<!-- 1. 阿里云鏡像:替代中央倉(cāng)庫(kù)(id=central) -->
<mirror>
<id>aliyun-central</id>
<name>Aliyun Mirror for Central</name>
<url>https://maven.aliyun.com/repository/central</url>
<mirrorOf>central</mirrorOf> <!-- 僅替代中央倉(cāng)庫(kù) -->
</mirror>
<!-- 2. 華為云鏡像:替代Spring倉(cāng)庫(kù)(id=spring-releases) -->
<mirror>
<id>huawei-spring</id>
<name>Huawei Mirror for Spring</name>
<url>https://repo.huaweicloud.com/repository/spring/</url>
<mirrorOf>spring-releases</mirrorOf> <!-- 僅替代Spring倉(cāng)庫(kù) -->
</mirror>
<!-- 3. 全局鏡像:替代所有倉(cāng)庫(kù),但排除私有倉(cāng)庫(kù)(id=company-private) -->
<mirror>
<id>global-mirror</id>
<name>Global Mirror (exclude private)</name>
<url>https://repo.example.com/maven/</url>
<mirrorOf>*,!company-private</mirrorOf> <!-- 排除私有倉(cāng)庫(kù) -->
</mirror>
</mirrors>
</settings>
4. 多鏡像的匹配優(yōu)先級(jí)
Maven 按<mirrors>中鏡像的配置順序匹配,一旦找到第一個(gè)符合mirrorOf規(guī)則的鏡像,就會(huì)使用該鏡像,后續(xù)鏡像不再生效。因此:
- 精確匹配的鏡像(如mirrorOf=central)應(yīng)放在模糊匹配鏡像(如mirrorOf=*)前面,避免被覆蓋。
- 優(yōu)先級(jí)高的鏡像(如速度快的國(guó)內(nèi)鏡像)應(yīng)放在前面。
四、多倉(cāng)庫(kù)與多鏡像的協(xié)同工作流程
當(dāng) Maven 需要下載一個(gè)依賴時(shí),整體流程如下:
(1)檢查本地倉(cāng)庫(kù):如果依賴已存在,直接使用,流程結(jié)束。
(2)查找遠(yuǎn)程倉(cāng)庫(kù):根據(jù)pom.xml或settings.xml中配置的遠(yuǎn)程倉(cāng)庫(kù)列表,確定需要訪問(wèn)的倉(cāng)庫(kù)(按配置順序)。
(3)匹配鏡像:對(duì)每個(gè)遠(yuǎn)程倉(cāng)庫(kù),檢查是否有鏡像的mirrorOf匹配該倉(cāng)庫(kù)的id:
- 若有匹配的鏡像,使用鏡像地址下載依賴。
- 若沒(méi)有匹配的鏡像,直接訪問(wèn)原倉(cāng)庫(kù)地址下載。
(4)緩存到本地倉(cāng)庫(kù)(僅只有一個(gè)):下載成功后,將依賴緩存到本地倉(cāng)庫(kù),供后續(xù)使用
五、總結(jié)
(1)多倉(cāng)庫(kù)解決 “依賴來(lái)源多樣性” 問(wèn)題,通過(guò)配置多個(gè)遠(yuǎn)程倉(cāng)庫(kù)獲取不同構(gòu)件,可在pom.xml(項(xiàng)目級(jí))或settings.xml(全局級(jí))中配置。
(2)多鏡像解決 “下載效率與統(tǒng)一管理” 問(wèn)題,通過(guò)mirrorOf規(guī)則指定替代的倉(cāng)庫(kù),僅在settings.xml中配置。
(3)核心是理解mirrorOf的匹配規(guī)則和鏡像與倉(cāng)庫(kù)的協(xié)同流程,避免鏡像覆蓋必要的倉(cāng)庫(kù),確保依賴能正常下載。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot 2.x基礎(chǔ)教程之使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的方法
在Spring Boot中編寫定時(shí)任務(wù)是非常簡(jiǎn)單的事,下面通過(guò)實(shí)例介紹如何在Spring Boot中創(chuàng)建定時(shí)任務(wù),實(shí)現(xiàn)每過(guò)5秒輸出一個(gè)當(dāng)前時(shí)間,感興趣的朋友跟隨小編一起看看吧2021-07-07
Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序
這篇文章主要介紹了Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn)
XML 文件在解析時(shí)會(huì)將五種特殊字符進(jìn)行轉(zhuǎn)義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
高內(nèi)聚低耦合原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
耦合度就是某模塊(類)與其它模塊(類)之間的關(guān)聯(lián)、感知和依賴的程度,是衡量代碼獨(dú)立性的一個(gè)指標(biāo),也是軟件工程設(shè)計(jì)及編碼質(zhì)量評(píng)價(jià)的一個(gè)標(biāo)準(zhǔn)2017-08-08
淺談SpringMVC之視圖解析器(ViewResolver)
本篇文章主要介紹了淺談SpringMVC之視圖解析器(ViewResolver),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08

