Maven 仓库解析
# Maven 仓库解析
Maven 仓库是管理和存储构件(如 JAR、WAR、POM 文件等)的地方,Maven 项目通过仓库获取所需的依赖项。Maven 仓库分为本地仓库、中央仓库和远程仓库。合理配置 Maven 仓库能够提高构建效率并减少重复依赖的下载。
# 什么是 Maven 仓库?
Maven 仓库是存放所有构件的地方,Maven 项目可以从这些仓库中获取自己所需的依赖。Maven 仓库分为以下几种类型:
- 本地仓库:存储在本地机器上,Maven 默认会首先在本地仓库中寻找依赖。
- 中央仓库:Maven 官方提供的默认远程仓库,所有 Maven 项目默认都会从这里下载依赖。
- 远程仓库:用户可以配置自定义的远程仓库,如公司内部的私有仓库或镜像仓库。
# Maven 寻找依赖的顺序
1. 本地仓库优先
无论仓库是定义在 pom.xml
还是 settings.xml
中,Maven 总是首先在本地仓库(通常位于 ~/.m2/repository
)中查找依赖。如果本地仓库中已经有需要的依赖,那么 Maven 不会访问远程仓库。
2. pom.xml
和 settings.xml
中的仓库
pom.xml
中的仓库:在解析依赖时,Maven 会按照pom.xml
中定义的仓库顺序依次查找。这些仓库的定义是项目级别的,优先级较高。settings.xml
中的仓库:settings.xml
中<profiles>
内定义的仓库配置通常是全局级别的,会在pom.xml
中的仓库之后进行查找。如果一个仓库仅在settings.xml
中定义,而不在pom.xml
中定义,那么在pom.xml
中没有找到依赖的情况下,Maven 会继续到settings.xml
中定义的仓库查找。
3. 镜像配置(Mirrors)
- 如果在
settings.xml
中配置了镜像(<mirrors>
元素),这个镜像会覆盖pom.xml
中的所有远程仓库请求。无论是pom.xml
中定义的仓库还是中央仓库,都会优先被重定向到镜像仓库。
4. 中央仓库
- 如果在
pom.xml
和settings.xml
中都没有找到依赖,且没有被镜像覆盖,Maven 最后会查找中央仓库(https://repo.maven.apache.org/maven2
)。
5. 实际顺序
- 本地仓库 >
pom.xml
中的仓库 >settings.xml
中的仓库(通常通过<profiles>
定义) > 中央仓库
# Maven 仓库结构
仓库类型:
本地仓库:开发者本机上的仓库,存储从远程仓库下载的依赖。首次运行 Maven 时,Maven 会自动创建本地仓库,默认位置为:
C:\Users\用户名\.m2\repository
。远程仓库:
- 中央仓库:由 Maven 官方维护的公共仓库,默认情况下 Maven 会从这里下载依赖。
- 私服:公司或部门内部的私有仓库,通常用于存放自有或私密的依赖资源。
私服的作用:
- 存储有版权的资源,如购买或自研的 JAR 包。
- 中央仓库中的资源大多为开源资源,私服可以存储私有资源。
- 在组织内部共享资源,提高依赖获取的效率。
# Maven 坐标
Maven 使用坐标来唯一标识和定位仓库中的资源。坐标类似于资源的“地址”,通过唯一标识定位到具体的依赖。
坐标组成:
groupId
:组织名称(通常为域名的反写)。artifactId
:项目名称或模块名称。version
:版本号。packaging
:打包类型(如jar
、war
)。
坐标的作用:坐标提供了资源的唯一标识,帮助 Maven 自动解析和下载依赖。
# 本地仓库配置
Maven 默认的本地仓库地址为 ${user.home}/.m2/repository
,你可以在 Maven 的 settings.xml
文件中自定义本地仓库的位置:
配置自定义本地仓库路径:
<settings>
<!-- 自定义本地仓库路径 -->
<localRepository>D:/.m2/repository</localRepository>
</settings>
2
3
4
建议:自定义仓库路径最好选择一个磁盘空间较大的位置,因为随着项目规模的增长,下载的依赖包数量会逐渐增多,占用大量磁盘空间。
# 远程仓库配置
Maven 默认从中央仓库下载依赖,配置如下:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2
3
4
5
6
7
8
9
10
11
配置解析:
<id>
:仓库的唯一标识,用于在项目中引用。<url>
:远程仓库的访问地址。<releases>
和<snapshots>
:配置是否允许下载发布版本(releases)和快照版本(snapshots)。
# 镜像仓库配置
为了加快下载速度,可以配置国内的镜像仓库,如阿里云的 Maven 仓库。镜像仓库的作用是替代默认的中央仓库,加快依赖下载速度。
配置镜像仓库:
在 settings.xml
文件中的 <mirrors>
标签中添加如下内容:
<mirrors>
<mirror>
<!-- 必须:唯一标识符,用于区分不同的镜像 -->
<id>nexus-aliyun</id>
<!-- 必须:指定要替代的远程仓库 -->
<mirrorOf>central</mirrorOf>
<!-- 可选:镜像名称,主要用于描述 -->
<name>Nexus aliyun</name>
<!-- 必须:镜像的 URL 地址 -->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<!-- 可选:仓库布局,通常为默认值 default -->
<layout>default</layout>
</mirror>
</mirrors>
2
3
4
5
6
7
8
9
10
11
12
13
14
详细说明:
<id>
(必须):用于标识镜像的唯一 ID,可以任意定义,但建议使用有意义的名称,如nexus-aliyun
。<mirrorOf>
(必须):指定该镜像替代的仓库。常见值为:central
:替代 Maven 官方中央仓库。*
:替代所有仓库。external:*
:替代所有非本地仓库。
<name>
(可选):镜像的名称,仅用于描述,实际配置中可省略。<url>
(必须):镜像的 URL 地址,Maven 下载依赖时会访问此地址。<layout>
(可选):仓库布局,通常为default
。在大部分情况下保留默认值即可。
配置效果:
配置完成后,Maven 将从国内的阿里云镜像仓库下载依赖,而不是从国外的中央仓库,速度会大幅提升。
# POM 中配置远程仓库
Maven 默认通过超级 POM 配置了 ID 为 central
的远程仓库,但在实际项目中,我们通常需要自定义其他远程仓库,例如使用局域网内的私有仓库或特定的公共仓库。
- 局域网的私有仓库:利用本地网络中的私有仓库,加速依赖下载,提升构建效率。
- 特定公共仓库:某些依赖项在中央仓库中无法找到,只能从指定的公共仓库中获取。
应用场景
如果有些 jar 包在 Maven 中央仓库没有,但是在其他仓库(例如:阿里仓库、spring 仓库、mybatis 仓库)里是有这个 jar 包的,例如spring 新发布了一个版本,由于是刚发行的版本,性能不太稳定,这个时候 Maven 中央仓库一般不会将这些 jar 包录入,但是你就是想用 spring 最新的版本,那么可以在 pom.xml 中通过配置 repositories 从指定的某公司官方仓库来获取相应的 jar 包。
# 1. repositories 标签
- 作用:用于指定项目依赖(如 JAR 包)下载来源。
- 适用场景:配置项目构建所需的第三方依赖库来源。
例如,项目中需要下载特定版本的第三方库(如 MySQL 驱动),Maven 会首先从配置的仓库中查找该依赖。
<repositories>
<repository>
<id>maven-repo</id>
<url>https://example.com/maven-repo</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2
3
4
5
6
7
8
9
10
11
12
# 2. pluginRepositories 标签
- 作用:用于指定 Maven 插件(如编译插件、打包插件)下载来源。
- 适用场景:配置项目构建过程中所需的 Maven 插件库来源。
例如,Maven 项目需要下载编译插件(maven-compiler-plugin
)或打包插件(maven-assembly-plugin
),Maven 会从配置的仓库中下载所需插件。
<pluginRepositories>
<pluginRepository>
<id>plugin-repo</id>
<url>https://example.com/plugin-repo</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
2
3
4
5
6
7
8
9
10
11
12
- 用途不同:
<repositories>
用于指定项目依赖库的下载来源,而<pluginRepositories>
用于指定构建插件的下载来源。 - 应用场景不同:
<repositories>
解决项目构建所需的第三方依赖,而<pluginRepositories>
解决构建过程中所需的 Maven 插件。
# 3. 配置一个中央仓库的中国镜像
以下配置示例展示了如何在 pom.xml
中添加一个指向中央仓库中国镜像的远程仓库:
<project>
...
<!-- 配置依赖库的远程仓库 -->
<repositories>
<repository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- 配置插件库的远程仓库 -->
<pluginRepositories>
<pluginRepository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
...
</project>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
在以上配置中,<repositories>
和 <pluginRepositories>
分别用于配置项目依赖库和插件库的远程仓库。每个仓库配置包含以下关键部分:
<id>
:仓库的唯一标识符,用于在项目中引用该仓库,名称可自定义。<name>
:描述该仓库的用途或来源,通常为自定义名称。<url>
:仓库的访问地址,此处为中央仓库的中国镜像。<releases>
和<snapshots>
:控制是否启用发布版本和快照版本的下载。<releases><enabled>true</enabled></releases>
:允许从该仓库下载发布版本(release)。<snapshots><enabled>false</enabled></snapshots>
:禁止从该仓库下载快照版本(snapshot)。
注意事项
- 配置多个远程仓库:可以在
<repositories>
或<pluginRepositories>
标签下配置多个远程仓库,每个仓库都有其独立的id
和url
。 - 禁用快照版本:不推荐从公共仓库下载快照版本,因为这些构件不稳定且不受你控制。如果需要使用组织内部的私有仓库,可启用快照版本支持。
- 仓库优先级:Maven 按配置顺序查询仓库,先配置的仓库优先被查询。
# 远程仓库配置的注意事项
- 优先本地仓库:Maven 优先从本地仓库查找依赖项,如果本地仓库没有依赖,才会从远程仓库下载。
- 快照版本管理:建议在项目中避免使用不稳定的快照版本(
snapshots
),除非是开发阶段。 - 镜像配置:如果网络环境不佳,可以配置中央仓库的镜像地址,如中国的镜像仓库,提升下载速度。
# 配置Maven 仓库按顺序加载
在 Maven 项目中,仓库的加载顺序是一个重要的配置项,特别是在项目依赖管理和构建过程中。通过合理配置仓库加载顺序,可以确保 Maven 优先从你指定的仓库中获取依赖,避免不必要的网络延迟或依赖冲突。
# 1. 在 pom.xml 中配置仓库顺序
pom.xml
是 Maven 项目的配置文件,可以为每个项目单独配置仓库的加载顺序。我们可以在 pom.xml
中配置多个远程仓库,并让 Maven 按顺序加载它们。
<repositories>
<!-- 优先从 Scholar 仓库加载 -->
<repository>
<id>nexus-scholar</id>
<url>https://nexus.wym123.cn/repository/maven-public/</url>
</repository>
<!-- 然后从阿里云公共仓库加载 -->
<repository>
<id>aliyunmaven</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
<!-- 最后从 Nexus aliyun 加载 -->
<repository>
<id>nexus-aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
步骤解析:
- Maven 会按照
pom.xml
中定义的顺序依次尝试每个远程仓库。 - 如果
nexus-scholar
中没有找到依赖,Maven 会继续尝试从aliyunmaven
获取,最后是nexus-aliyun
。
# 2. 在 settings.xml 中配置全局仓库顺序
如果你希望全局设置所有 Maven 项目都按照特定的仓库顺序加载依赖,可以在 settings.xml
中配置全局仓库。这个配置适用于所有 Maven 项目,而不仅仅是单个项目。
配置方法:
定位
settings.xml
文件:- 位置:通常在
~/.m2/settings.xml
(Linux 和 macOS)或C:\Users\你的用户名\.m2\settings.xml
(Windows)。
- 位置:通常在
配置仓库顺序:
- 使用
<profiles>
元素在settings.xml
中定义全局仓库顺序。 - 激活该
profile
,使其对所有项目生效。
- 使用
示例配置:
<settings>
<!-- 其他配置 -->
<profiles>
<profile>
<id>custom-repos</id>
<repositories>
<!-- 优先从 Scholar 仓库加载 -->
<repository>
<id>nexus-scholar</id>
<url>https://nexus.wym123.cn/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<!-- 然后从阿里云公共仓库加载 -->
<repository>
<id>aliyunmaven</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<!-- 最后从 Nexus aliyun 加载 -->
<repository>
<id>nexus-aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<!-- 自动激活全局配置 -->
<activeProfiles>
<activeProfile>custom-repos</activeProfile>
</activeProfiles>
</settings>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
配置解析:
- 全局生效:所有 Maven 项目都会使用这个
profile
中定义的仓库顺序。 - 自动激活:通过在
<activeProfiles>
中定义custom-repos
,确保每次 Maven 构建时都使用该仓库顺序。
注意事项
- 仓库可用性:确保你配置的仓库是可用的,并且包含你项目所需的依赖。否则,Maven 在按顺序尝试这些仓库时可能无法找到依赖,导致构建失败。
- 排除不需要的仓库:在一些情况下,你可能希望排除某些仓库,可以使用
<mirrorOf>
和排除规则来实现(如!central
)。