原文地址:https://alphahinex.github.io/2024/11/17/maven-repositories-and-mirrors/
description: "下載依賴不迷路"
date: 2024.11.17 10:34
categories:
- Java
tags: [Java, Maven]
keywords: repository, profile, mirror, settings.xml, pom, nexus, central
一些概念
倉庫(Repository)
Maven 中,倉庫(Repository)是指存放 pom
和 jar
等文件的地方勋桶,分為本地倉庫和遠(yuǎn)程倉庫觉啊。
本地倉庫(Local Repository)
本地倉庫是 Maven 在本地文件系統(tǒng)中的一個目錄,用于存儲 Maven 項目的構(gòu)建輸出、依賴庫帽借、插件等妓盲。默認(rèn)情況下,本地倉庫位于用戶目錄下的 .m2
目錄慧瘤〈饕眩可以在 settings.xml 配置文件中通過 <localRepository>
元素修改本地倉庫的默認(rèn)路徑。
遠(yuǎn)程倉庫(Remote Repository)
不在本地的倉庫锅减,都是遠(yuǎn)程倉庫糖儡,一般通過網(wǎng)絡(luò)訪問。遠(yuǎn)程倉庫大致分為以下幾類:
-
中央倉庫(Central Repository):指由
Sonatype
公司維護(hù)的 Maven 官方倉庫怔匣,地址 https://repo.maven.apache.org/maven2 握联。 - 插件倉庫(Plugin Repository):倉庫包含兩種主要類型的工件(artifact)。第一種是作為其他工件依賴項使用的工件每瞒。這些工件是中央倉庫中大多數(shù)工件金闽。另一種類型的工件是插件。Maven 插件本身是一種特殊類型的工件剿骨。因此代芜,插件倉庫可能會與其他倉庫分開。
- 鏡像倉庫(Mirror Repository):鏡像倉庫是一個代理服務(wù)器浓利,用于加速 Maven 項目的依賴庫挤庇、插件等的下載钞速。鏡像倉庫會緩存被代理倉庫中的內(nèi)容,可以鏡像中央倉庫嫡秕,也可以鏡像其他類型的倉庫渴语。
- 私有倉庫(Private Repository):私有倉庫一般是指非 Maven 官方維護(hù)的 Maven 倉庫,工件的發(fā)布流程較中央倉庫更加自由昆咽。最佳實踐是通過 Repository Manager 來搭建一個私有倉庫驾凶,如常見的 Sonatype Nexus OSS。
Maven 中的相關(guān)配置
倉庫(Repository)
倉庫會按如下 順序 查詢配置文件掷酗,直到找到有效結(jié)果:
- 有效的
settings
:- 全局
settings.xml
(${maven.home}/conf/settings.xml
) - 用戶
settings.xml
(${user.home}/.m2/settings.xml
)
- 全局
- 有效的本地 POM:
- 本地
pom.xml
- 父 POM调违,遞歸查找
- Super POM
- 本地
- 依賴路徑中工件的有效的 POM
Profile
在 settings.xml
的配置中,倉庫 需要配置到 profiles 下泻轰。多個激活的 profile 中配置的倉庫翰萨,按照 profile 定義的順序 倒序 查詢,不按照激活 profile 的順序糕殉。例如在 settings.xml
中有如下配置:
<settings>
...
<profiles>
<profile>
<id>no3</id>
<repositories>
<repository>
<id>repo3</id>
<url>https://repo3.com/maven2</url>
</repository>
<repository>
<id>repo4</id>
<url>https://repo4.com/maven2</url>
</repository>
</repositories>
</profile>
<profile>
<id>no2</id>
<repositories>
<repository>
<id>repo2</id>
<url>https://repo2.com/repository/public</url>
</repository>
</repositories>
</profile>
<profile>
<id>no1</id>
<repositories>
<repository>
<id>repo1</id>
<url>https://repo1.org/maven2</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>no2</activeProfile>
<activeProfile>no3</activeProfile>
<activeProfile>no1</activeProfile>
</activeProfiles>
...
</settings>
會優(yōu)先使用在 repo_no1
profile 中定義下載依賴使用的倉庫順序會是 repo1
, repo2
, repo3
, repo4
亩鬼。
可以使用 mvn help:effective-settings
和 mvn help:effective-pom -Dverbose
來查看包含配置文件的有效設(shè)置和本地構(gòu)建 POM,以便輕松查看它們的倉庫順序阿蝶。
鏡像(Mirror)
在從倉庫下載工件之前雳锋,會先應(yīng)用鏡像配置。
比如在 Super POM
中定義的 central
倉庫羡洁,在網(wǎng)絡(luò)受限環(huán)境可以使用 Nexus
搭建一個中央倉庫的代理服務(wù)玷过,然后通過鏡像配置將需要從中央倉庫地址下載的工件替換為使用 Nexus
的地址加速下載。
可以在 settings.xml
配置文件的 mirrors 標(biāo)簽內(nèi)配置鏡像倉庫筑煮,通過 mirrorOf
和倉庫 id
進(jìn)行關(guān)聯(lián)辛蚊,如:
<settings>
...
<mirrors>
<mirror>
<id>internal-repository</id>
<name>Maven Repository Manager running on repo.mycompany.com</name>
<url>http://repo.mycompany.com/proxy</url>
<mirrorOf>*,!repo1</mirrorOf>
</mirror>
<mirror>
<id>foo-repository</id>
<name>Foo</name>
<url>http://repo.mycompany.com/foo</url>
<mirrorOf>repo1</mirrorOf>
</mirror>
</mirrors>
...
</settings>
上面配置為所有非
repo1
的倉庫配置了一個鏡像地址,為repo1
倉庫配置了另一個鏡像地址真仲。更多用法可參閱 Using Mirrors for Repositories袋马。