摘要:本文了解了Maven三大独立生命周期的阶段组成与核心作用,学习了如何对生命周期进行定制。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
Maven 3.6.0
1 定义
Maven生命周期是一套标准化的项目构建流程约定,它定义了项目发版的全流程步骤,并规定了这些步骤的执行顺序。其核心价值在于:
- 自动化:按约定顺序自动执行构建步骤,无需手动分步操作。
- 标准化:所有Maven项目遵循同一套目录结构和构建流程。
- 基石:Maven的插件需绑定到生命周期的特定阶段才能生效,生命周期是插件运行的基石。
2 生命周期
Maven将构建流程拆分为三个完全独立的生命周期:Clean(清理)、Default(核心构建)、Site(文档生成)。三者互不干扰,可单独执行(如仅清理不构建,或仅生成文档不清理),也可组合执行(如先清理再构建)。
2.1 Clean
2.1.1 说明
Clean生命周期的核心作用是删除上一次构建生成的临时文件(如target目录),为新构建提供干净环境,避免旧文件残留导致构建异常。
2.1.2 组成
阶段组成:
| 阶段名称 | 核心作用 |
|---|---|
| pre-clean | 执行清理前的准备工作:备份旧target构建输出目录、删除自定义临时文件 |
| clean | 核心清理步骤:删除默认target构建输出目录 |
| post-clean | 执行清理后的收尾工作:删除备份文件、通知其他系统清理完成 |
2.1.3 注意
执行mvn clean命令仅触发pre-clean阶段和clean阶段,不会触发post-clean阶段,需显式配置插件才会执行。
触发clean阶段仅删除默认target目录,若有自定义输出目录,需通过maven-clean-plugin配置额外清理路径。
Clean生命周期与其他生命周期完全独立,需显式执行mvn clean命令才会触发Clean生命周期。
2.2 Default
2.2.1 说明
Default生命周期是Maven最核心的生命周期,覆盖全流程,几乎所有日常构建操作都基于此生命周期。
核心特性:
- 阶段顺序固定:所有阶段按前置依赖顺序执行,执行某个阶段时,会自动触发其所有前置阶段。
- 阶段数量多:包含23个阶段,日常开发仅关注核心阶段。
- 插件绑定:每个阶段的功能由对应的Maven插件实现。
2.2.2 组成
阶段组成:
| 阶段名称 | 核心作用 | 依赖插件 | 结果验证 |
|---|---|---|---|
| validate | 验证项目合法性:检查项目结构是否完整、依赖是否缺失、配置是否正确 | 核心模块直接处理 | 检查不通过直接报错 |
| initialize | 初始化构建环境:创建临时目录、加载构建参数、生成构建所需的元数据文件 | 核心模块直接处理 | 在target目录下出现maven-status等临时目录 |
| process-resources | 处理主程序资源文件:将src/main/resources目录下的配置文件复制到target/classes目录下,并替换资源中的占位符属性 | 依赖maven-resources-plugin插件 | 在target/classes目录下出现资源文件 |
| compile | 编译主程序源码:将src/main/java目录下的Java文件编译为字节码文件,输出到target/classes目录下 | 依赖maven-compiler-plugin插件 | 在target/classes目录下出现编译后的主程序字节码文件 |
| process-test-resources | 处理测试资源文件:将src/test/resources目录下的测试配置文件复制到target/test-classes目录下 | 依赖maven-resources-plugin插件 | 在target/test-classes目录下出现测试资源文件 |
| test-compile | 编译测试程序源码:将src/test/java目录下的Java文件编译为字节码文件,输出到target/test-classes目录下 | 依赖maven-compiler-plugin插件 | 在target/test-classes目录下出现编译后的测试字节码文件 |
| test | 执行单元测试:运行target/test-classes目录下的测试类,执行@Test注解的测试方法,生成测试报告 | 依赖maven-surefire-plugin插件 | 控制台输出测试结果,在target目录下生成surefire-reports测试报告 |
| package | 打包构建产物:将target/classes目录下的主程序字节码文件、资源文件打包为压缩文件,生成Jar包或War包 | Java项目依赖maven-jar-plugin插件,Web项目依赖maven-war-plugin插件 | 在target目录下出现Jar包或War包 |
| install | 安装产物到本地仓库:将打包产物及pom.xml文件复制到本地仓库,供本地其他项目依赖 | 依赖maven-install-plugin插件 | 在本地仓库对应GAV目录下找到打包产物 |
| deploy | 部署产物到远程仓库:将打包产物复制到远程私服,供团队共享 | 依赖maven-deploy-plugin插件 | 在远程私服对应目录下找到打包产物 |
2.2.3 注意
命令与阶段对应关系:
| 常用命令 | 触发阶段 | 核心用途 |
|---|---|---|
| mvn compile | validate initialize process-resources compile | 仅编译主程序源码 |
| mvn test | 上述阶段 + process-test-resources test-compile test | 编译并执行单元测试 |
| mvn package | 上述阶段 + package | 执行编译和测试,生成打包文件 |
| mvn install | 上述阶段 + install | 打包并安装到本地仓库 |
| mvn deploy | 上述阶段 + deploy | 打包并安装到本地仓库,然后部署到远程私服 |
2.3 Site
2.3.1 说明
Site生命周期的核心作用是自动生成项目的标准化文档站点,包含项目说明、依赖报告、测试报告、团队信息等,方便团队协作与项目维护。
2.3.2 组成
阶段组成:
| 阶段名称 | 核心作用 | 依赖插件 | 结果验证 |
|---|---|---|---|
| pre-site | 生成站点前的准备工作:检查文档资源是否完整、初始化站点目录 | 核心模块直接处理 | 在target目录下生成site临时目录 |
| site | 核心阶段:生成HTML格式的项目站点文档 | 依赖maven-site-plugin插件 | 在target/site目录下生成HTML文档 |
| post-site | 生成站点后的收尾工作:检查站点文档完整性、准备部署资源 | 核心模块直接处理 | 生成站点部署所需的元数据文件 |
| site-deploy | 部署站点文档到远程服务器 | 依赖maven-site-plugin插件 | 远程服务器上的target目录下生成site临时目录,包含HTML文档 |
2.3.3 注意
命令与阶段对应关系:
| 常用命令 | 触发阶段 | 核心用途 |
|---|---|---|
| mvn site | pre-site site post-site | 生成站点文档 |
| mvn site-deploy | 上述阶段 + site-deploy | 生成并部署站点 |
执行mvn site-deploy命令需先在pom.xml文件中配置远程站点仓库:
1
2
3
4
5
6<distributionManagement>
<site>
<id>github-pages</id>
<url>scm:git:https://github.com/your-name/your-repo.git</url>
</site>
</distributionManagement>
3 行为定制
3.1 跳过测试
如果需要临时跳过测试环节,有两种方式配置:
- 执行
mvn test -DskipTests命令会跳过测试执行,但不会跳过测试编译,仍会编译测试源码。适用于快速打包的场景。 - 执行
mvn test -Dmaven.test.skip=true命令会跳过测试编译和测试执行。适用于测试代码尚未开发完成的场景。
如果需要永久跳过测试环节,需要修改pom.xml文件:
1 | <build> |
3.2 指定阶段
若仅需执行某个阶段,直接调用该阶段的命令即可。
示例:
- 执行
mvn process-resources命令仅处理主程序资源文件,不编译文件。 - 执行
mvn test-compile命令仅编译测试代码,不执行测试。
3.3 绑定插件
Maven生命周期的阶段本身不实现具体功能,而是绑定到对应的插件目标来完成工作。
绑定方式:
- 默认绑定:Maven为核心阶段预设了插件。
- 自定义绑定:可以为某个阶段绑定指定插件。
示例:为package阶段绑定Javadoc插件:
1 | <build> |
条