这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」
1. Maven 生命周期
Maven 约定了标准化的项目结构,并通过一套流程来完成项目的编译、打包、发布等,整个流程由多个阶段组成,并最终形成 Maven 的生命周期。
1.1 标准生命周期
Maven 中标准的生命周期有三个,分别是 clean、default、site。
- clean,项目清理的处理,用于清理项目中生成的 class 和 jar 文件,包含 pre-clean、clean、post-clean 三个阶段。
- default,又叫 build,项目部署的处理,其中主要包含如下阶段
- validate,校验阶段,检查项目是否满足构建必要条件
- compile,编译阶段,对项目源码执行编译
- test,测试阶段,执行项目中的 JUnit 单元测试逻辑
- package,打包阶段,根据设置将编译后的代码打包为 War 或 Jar 包
- verify,验证阶段,检查项目包是否存在质量问题
- install,安装阶段,将项目包安装到本地仓库,其他项目可以引用该依赖
- deploy,部署阶段,将项目包部署到配置的远程仓库中
- site,项目站点文档创建的处理,用于创建新的报告文档、部署站点等,其中包含了 pre-site、site、post-site、site-deploy 阶段。
1.2 生命周期阶段执行
Maven 中可以使用命令来执行某个生命周期的阶段,在该阶段执行时,其之前的所有阶段都会被执行,如 mvn clean 会执行 pre-clean 和 clean 两个阶段。
对于 Maven 中不同的生命周期之间是独立的,如 mvn install 命令仅会顺序执行 default 生命周期中 validate 到 install 的所有阶段。
使用 Maven 命令时还可以同时指定多个阶段,如 mvn clean deploy 是先执行项目的清理处理,再执行 default 生命周期中 validate 到 deploy 的所有阶段,最终将构建的项目发布到共享仓库中。
Maven 执行生命周期阶段时本质上是在执行该阶段默认的 goal ,类似 Java 中的函数,如 mvn compile 实际执行阶段中 compiler:compile。
2. Maven 依赖管理
2.1 Project Object Model
Project Object Model 即 POM,项目对象模型,作为 XML 文件用于描述项目的依赖和构建信息。
Maven 在执行时,会检查项目中的 POM 文件,即 pom.xml,根据其中的配置信息来执行项目任务。
POM 文件中可以指定的配置包括有:
- 项目的基础信息,包括项目组 ID 、项目 ID、版本、项目名称和描述等
- parent 标签中定义的项目 Super POM 信息
- properties 标签中定义的项目属性信息,作为 POM 中变量使用
- dependencies 标签中定义的项目依赖信息
- build 标签中定义的项目构建信息
2.2 引入依赖信息
Maven 中引入一个外部依赖十分简单,只需要在 POM 文件中配置该依赖在仓库中的坐标信息,使用时 Maven 会自动获取该坐标对应的依赖包。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>
</dependencies>
如果想要在引入依赖的同时移除其中的子依赖信息,可以在 dependency 中使用 exclusions 标签。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.6</version>
<!-- 排除冲突依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
2.3 Maven 仓库
Maven 仓库是用来存放第三方依赖包的地方,并在 POM 文件中通过坐标描述在仓库中唯一指定依赖信息。
Maven 仓库按照类型可以分为本地仓库、中央仓库和远程仓库。
- local,本地仓库,本地首次执行 Maven 命令时会生成本地仓库来存储从远程下载的需要的依赖信息,并在之后执行时直接使用。
- central,中央仓库,是 Maven 官方维护的仓库,当项目依赖信息在本地寻找不到时,会到中央仓库中寻找,并将找到的依赖下载至本地。
- remote,远程仓库,Maven 允许开发人员自定义项目的远程仓库信息,以避免在中央仓库找不到依赖后输出错误,开发人员可以创建私有的远程仓库并提供相关依赖信息。
实际使用 Maven 命令时,依赖信息首先会在本地仓库查找,如果找不到则到中央仓库中查找并下载到本地仓库;如果仍然找不到,则会到指定的远程仓库中寻找并下载到本地仓库;当远程仓库不存在或找不到依赖时均会抛出错误信息。
2.4 Maven 插件 Plugins
Maven本质上是一个插件执行框架,所有的工作都是由插件来完成的。
如 1.2 中提到使用命令执行生命周期中阶段时,实际上就是通过 Maven 插件完成的。
Maven 插件通常定义在 POM 文件中的 plugins 标签中,通过 phase 标签指定插件对应阶段,并且针对每个插件,可以使用 goals 标签设置多个目标,使用 tasks 标签设置插件的执行任务。
常见的 Maven 标准插件有:
-
clean,清理目标文件,对应 clean 阶段
-
compiler,编译文件,对应 compile 阶段
-
surefile,执行 JUnit 单元测试,对应 test 阶段
-
jar,构建项目为 jar 包,对应 package 阶段
-
war,构建项目为 war 包,对应 package 阶段
-
javadoc,生成 Javadoc 文档
-
antrun,构建阶段中允许 ant 任务 对于 Maven 中自带的标准插件,使用时并不需要声明,而引入其他插件时需要声明后使用。