Maven 的组成和配置
# 25.Maven 的组成和配置
本文来讲解一下关于 Maven 的组合和配置,便于后续对 Maven 的讲解和学习。
# Maven 目录结构分析
我们解压 Maven 后,可以看到文件夹里有这些内容:
apache-maven-3.8.3
├── bin
├── boot
├── conf
├── lib
├── LICENSE
├── NOTICE
├── README.txt
2
3
4
5
6
7
8
我们简单来说下各个目录的作用,读者有个印象即可:
- bin 目录:存放了 Maven 的命令脚本,我们上一小节输入的有关 Maven 的命令,都是在调用这些脚本
- boot 目录:存放了一些 Maven 本身的引导程序,如类加载器等
- conf 目录:存放了 Maven 的一些配置文件,如 setting.xml 文件是非常重要的配置文件
- lib 目录:存放了 Maven 本身运行所需的一些依赖
- LICENSE:许可证说明文件
- NOTICE:一些注意事项
- README.txt:说明文档
# 全局配置和用户配置
目前操作系统都支持多用户,也就是可以创建多个用户,并且让多个用户同时使用。例如我们日常开发的时候,一个 Linux 服务器通常是有多个用户的,Windows 也不例外,只不过大部分 Windows 都是用作个人电脑,比较少涉及到多用户。
因此,大部分软件也考虑到了这样的情况,比如在 Windows 下安装软件的时候,会提示是安装给所有用户,还是仅仅为当前用户安装。
多用户的基本原理,就是根据文件权限来实现的,例如每个用户都有自己的主目录,而安装在全局的软件,可以给所有用户都使用到。
Maven 也有这样的机制,在 Maven 的安装目录下,conf 里的配置就是全局配置。但是在用户目录下,也有一个配置文件,例如我的是在:C:\Users\peterjxl\.m2\settings.xml
,这个文件就是用户自己对 Maven 的配置。
这样有几个好处:
- 每个用户可以有自己不同的配置文件,并且不会相互影响;Maven 会优先使用用户自己的配置文件,然后才是全局的配置文件。换句话说,如果用户的配置文件和全局的配置文件,都做了某个配置,那么会以用户的优先
- 如果没有这样的机制,一旦某个用户修改了全局的配置文件,那么所有用户都会收到影响。
- 如果用户没有配置文件,则默认使用全局的配置文件
- 如果 Maven 有升级,那么各个用户也不会收到影响(如果都使用全局的配置文件,那么升级 Maven 后还要修改对应的 settins.xml)
当然,相信大部分读者都是使用自己的电脑来学习 Maven,直接使用和修改全局配置也是可以的,需读者自行选择。
# 配置 settings.xml
关于 Maven 的配置,大部分都是修改 Maven 的 conf/settings.xml 文件。
# 修改仓库地址
我们之前说过,Maven 会将下载的依赖放到本地仓库里,那么是放在哪里呢?
我们可以打开 Maven 的配置文件 apache-maven-3.8.3\conf\settings.xml,第 46 行左右,可以看到这样的注释:
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
2
3
4
5
6
7
8
9
localRepository 就是本地仓库的意思,可以看到注释里说默认值是 ${user.home}/.m2/repository,也就是用户目录下的.m2 文件夹里。
对于笔者来说,仓库里存放的 jar 包都挺大,为了不占用宝贵的 C 盘空间,我会设置成本地仓库的地址为 D 盘,例如:
<localRepository>D:\Projects\apache-maven-3.8.3\repository</localRepository>
由于我们刚安装完 Maven,本地仓库肯定是空的,那么 Maven 遇到这种情况,就会去中央仓库里寻找依赖,然后下载到本地仓库里。
中央仓库地址:https://repo.maven.apache.org/maven2/
这个中央仓库是配置在哪的呢?在 apache-maven-3.8.3\lib\maven-builder-support-3.8.3.jar 里。我们解压这个 jar 包,一步步找到\org\apache\maven\model\pom-4.0.0.xml 文件,可以看到里面有这样的配置
<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
# 配置镜像地址
为了加快下载依赖的速度,我们可以选择从阿里云提供的仓库里下载,因为阿里云在国内,比访问国外的话网速要快不少。
我们打开 settings.xml,找到 mirrors
标签(148 行左右),可以看到如下内容:
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
-->
</mirrors>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注释告诉我们,这里可以配置一个仓库,而不是用默认的仓库。并告诉我们配置的格式如下:
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
2
3
4
5
6
我们新建一个阿里云的配置:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
2
3
4
5
6
后续我们下载依赖的时候,可以看到控制台里显示下载地址变成阿里云的了,速度会快很多,而之前我们都是从中央仓库下载:
该截图是我们演示 第一个 Maven 项目的时候,编译和打包时,从中央仓库用到的一些插件
修改之后,都是从阿里云的网站上下载了:
可以配置多个 mirror,但一般只有第一个生效。如果第一个镜像网站宕机了,才会从第二个镜像下载。
# 镜像地址的原理
其实 mirror 配置后,是拦截对远程仓库的请求 , 改变对目标仓库的下载地址。
例如我们刚刚配置的是:<mirrorOf>central</mirrorOf>
,这表明如果有对 central
这个中央仓库的请求,就拦截它,改为从阿里云的仓库里下载 jar 包。
除此之外,<mirrorOf>
还支持正则表达式,例如星号 *
表示匹配所有,这样配置的话所有请求都是转到该镜像里。
# 配置某个项目的镜像地址
上述的配置是修改了 Maven 的 settings.xml 文件,该配置文件会对所有项目生效;
Maven 可以针对每个项目配置不同的中央仓库,在项目 pom.xml <repositories>
节点下增加如下配置即可:
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
2
3
4
5
6
7
8
9
10
11
12
# 小结
本文我们简单介绍了下 Maven 的组成,并且讲解了如何配置 Maven,在后续的过程中我们有不少地方需要配置 Maven 的。