在Maven出现之前,项目构建的生命周期就已经存在了,例如清理、编译、部署等操作。Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务都交给插件来完成。
一、三套生命周期
Maven拥有三套相互独立的生命周期,分别为clean、default、site。
- 每个生命周期都包含一些有序的阶段, 并且后面的阶段依赖前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。
- 三个生命周期是相互独立的,例如当用户调用clean生命周期的某个阶段,不会触发default生命周期的任何阶段,反之亦然,当用户调用default生命周期的时候,不会出发clean生命周期的任何阶段。
1.1 、clean生命周期(在进行真正的构建工作之前做一些清理的工作)
- pre-clean:执行一些清理前需要完成的工作
- clean:清理上一次构建的文件
- post-clean:执行一些清理后需要完成的工作
1.2、default生命周期(构建的核心部分,编译、测试、打包、部署、发布等)
- validate:验证该项目是正确的,并且确定所有必须的信息都是可用的
- initialize:初始化构建状态,例如创建目标目录
- generate-sources:生成要编译的任何源代码
- process-source:处理源代码
- generate-resources:生成要打包在包里的资源文件
- process-resources:将资源文件处理并复制到目标文件夹
- compile:编译项目主代码
- process-classes:处理编译后的.class文件
- generate-test-sources:如上
- process-test-sources:如上
- generate-test-resources:如上
- process-test-resources:如上
- test-compile:编译项目的测试代码
- process-test-classes:如上
- test:使用单元测试框架运行,测试代码不会被打包或部署
- prepare-package:打包预处理
- package:打包
- pre-integration-test:继承测试之前准备
- integration-test:集成测试
- post-integration-test:集成测试后扫尾操作,例如清除运行时用到的环境变量
- verify:检查是否打包标准且成功
- install:将包安装在Maven本地仓库
- deploy:将最终的包复制到远程仓库
1.3 site生命周期(生成项目报告、站点、发布站点)
- pre-site:执行一些在生成项目站点之前的操作
- site:生成项目站点文档
- post-site:执行一些在生成项目站点之后需要完成的操作
- site-deploy:将生成的项目站点发布到服务器上
二、命令行和生命周期
- $mvn clean:执行clean生命周期的clean阶段
- $ mvn test:执行default生命周期的test阶段,会从default生命周期的第一个阶段执行到test阶段
- $mvn clean install:执行clean生命周期的clean阶段和default生命周期的install阶段
- $mvn clean deploy site-deploy:执行clean生命周期的clean阶段,执行default生命周期的deploy阶段,执行site生命周期的site-deploy阶段
Maven命令的话基本就是mvn加生命周期,所以掌握Maven的生命周期,就会对Maven有一定的了解
三、插件目标
回顾文章开头所说:
- Maven的核心仅仅时定义了抽象的生命周期
- 具体的任务都是交给插件去完成的
- 插件以独立的构件形式存在,所以Maven核心的分发包只有不到3M
- Maven会在需要的时候下载并使用插件(类似引入依赖)
对于插件来说,它一般有多个功能,我们把插件的一个功能叫做插件的目标
四、插件绑定
Maven的生命周期与对应的插件相互绑定,用以完成实际的构建任务。具体来说时生命周期的阶段与插件的目标项目绑定。
例如default生命周期的compile这个阶段和maven-compile-plugin绑定
4.1 内置绑定
为了能让用户几乎不用任何配置就能构建Maven项目,Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务
4.2 自定义绑定
因为Maven默认只提供了主要生命周期阶段的绑定插件,所以用户也可以通过配置将插件绑定在某个生命周期阶段得以执行。
五、插件的配置
插件的配置主要有两种方式:
- 命令行插件配置:
- Maven命令中使用-D参数,并伴随一个参数键=参数值的形式
- 例如常用的mvn clean package -Dmaven.test.skip=true
- POM文件配置
- 配置插件的全局配置,如配置compile插件的编译版本
- 为某个插件任务配置特定的参数