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

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

3. 多倉庫配置示例
(1)在pom.xml中配置項目級倉庫
<project>
<!-- 其他配置 -->
<repositories>
<!-- 中央倉庫(Maven默認已內(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倉庫(獲取Spring相關依賴) -->
<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倉庫(獲取Android相關依賴) -->
<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中配置全局級倉庫
<settings>
<!-- 其他配置 -->
<profiles>
<profile>
<id>custom-repos</id>
<repositories>
<!-- 私有倉庫(企業(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>
<!-- 其他共用倉庫 -->
</repositories>
</profile>
</profiles>
<!-- 激活上述profile,使其生效 -->
<activeProfiles>
<activeProfile>custom-repos</activeProfile>
</activeProfiles>
</settings>
4. 多倉庫配置注意事項
- 倉庫 ID 唯一性: 每個倉庫的id必須唯一(Maven 通過id識別倉庫),否則會導致沖突。
- releases/snapshots開關: 通過enabled控制是否允許從該倉庫下載正式版 / 快照版依賴(快照版不穩(wěn)定,生產(chǎn)環(huán)境通常關閉)。
- 優(yōu)先級: pom.xml中的倉庫優(yōu)先級高于settings.xml,即項目級配置會覆蓋全局配置(如需全局生效,建議配置在settings.xml)。
三、多鏡像源配置:原理與規(guī)則
鏡像的核心作用是 “替代遠程倉庫”,當配置多個鏡像時,需通過mirrorOf屬性明確每個鏡像替代哪些倉庫,避免沖突。
1. 鏡像的配置位置
鏡像只能在settings.xml的<mirrors>標簽中配置(全局生效),無法在pom.xml中配置(保證鏡像的全局統(tǒng)一性)。
2. 多鏡像配置的核心:mirrorOf規(guī)則
mirrorOf是鏡像配置的靈魂,用于指定 “當前鏡像替代哪些倉庫”,其值通過倉庫的id匹配(倉庫id在<repository>中定義)。常見規(guī)則如下:

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

