Maven的生命周期是对项目所有的构建过程进行抽象和统一。它包含了项目的清理、初始化、编译、测试、打包、部署和站点生成等构建步骤。Maven的生命周期本质是定义项目构建的各个步骤,它本身是抽象的,并不作任何的具体工作,而是将构建过程中的各个步骤任务交个相对应的插件来完成。这使得Maven的生命周期具有良好的扩展性,开发者可以自己编写插件实现代码绑定到构建的某个步骤。当然,在绝大部分场景下,开发者不必这样来做,因为Maven初始为项目构建的各个步骤绑定了默认的插件。
生命周期
Maven有三个相互独立的生命周期。它们分别是:Clean Default Site。
| 生命周期 | 描述 |
|---|---|
| Clean | 用于清理项目 |
| Default | 用于构建项目 |
| Site | 用于生成项目站点 |
每个独立的生命周期都包含一些阶段(phase),这些阶段是一个有序的组合,后面的阶段依赖于前面的阶段。Maven主要的生命周期阶段在下表中已用加粗字体标出。
Clean生命周期
| 阶段 | 描述 |
|---|---|
| pre-clean | 在实际项目清理之前执行所需的过程 |
| clean | 删除上一个版本生成的所有文件 |
| post-clean | 执行完成项目清理所需的过程 |
Default生命周期
| 阶段 | 描述 |
|---|---|
| validate | 验证项目所有必要的信息都是可用的 |
| initialize | 初始化构建状态,例如设置属性或创建目录 |
| generate-sources | 生成包含在编译中的源代码 |
| process-sources | 处理源代码,过滤和替换一些变量的值 |
| generate-resources | 生成包含在包中的资源 |
| process-resources | 处理资源包,将其复制到目标目录 |
| compile | 编译项目的源代码 |
| process-classes | 从编译中对生成的文件进行后处理,如对Java类进行字节码增强 |
| generate-test-sources | 生成包含在编译中的测试源代码 |
| process-test-sources | 处理源代码,过滤和替换一些变量的值 |
| generate-test-resources | 生成包含在测试包中的资源 |
| process-test-resources | 处理资源包,将其复制到测试目标目录 |
| test-compile | 编译项目的测试源代码 |
| process-test-classes | 从编译中对生成的测试文件进行后处理,如对Java类进行字节码增强 |
| test | 执行单元测试,测试代码不会被打包部署 |
| prepare-package | 打包之前执行所需的任何操作 |
| package | 打包项目 |
| pre-integration-test | 集成测试前执行的操作,如设置环境等 |
| integration-test | 执行集成测试,如果需要,可将软件包部署到可运行集成测试的环境 |
| post-integration-test | 集成测试后执行的操作,如清理环境 |
| verify | 检查软件包是否符合标准 |
| install | 将项目输出构件安装到本地仓库 |
| deploy | 将项目输出构件部署到远程仓库 |
Site生命周期
| 阶段 | 描述 |
|---|---|
| pre-site | 在实际项目站点生成之前执行所需的过程 |
| site | 生成项目的站点文档 |
| post-site | 执行完成站点生成所需的进程,并准备站点部署 |
| site-deploy | 将生成的站点文档部署到指定的Web服务器 |
命令行命令
Maven执行项目构建的过程实质上是调用Maven生命周期阶段的过程。Maven主要的生命周期阶段并不多,其命令行命令几乎都是基于这些阶段的简单组合。而且Maven的大三生命周期是相互独立的,每个生命周期的阶段都有前后依赖的关系。任何一个简单的或组合的命令,只有当前面的阶段执行成功,后面的阶段才有机会得以继续执行。如果前面的某个阶段执行失败,后面的阶段就会被短路而导致无法继续执行下去。
$ mvn clean deploy
clean:调用Clean生命周期的clean和clean之前的所有阶段(即pre-clean和clean)deploy:调用Default生命周期compile + test + package + install + deploy五个主要的阶段
因此,执行该命令最终达到的效果是:
清理项目 → 编译项目 → 单元测试 → 打包项目 → 将软件包安装到本地 → 将软件包发布到远程仓库
生命周期内置绑定的插件
Maven的生命周期是抽象的,它本身不做任何具体的工作,项目构建的过程实质是调用Maven生命周期阶段的过程,而Maven初始已经为生命周期的大部分阶段绑定了默认的插件,当外部调用Maven生命周期阶段的时候,绑定到这些阶段的插件就会来执行对应的具体工作。
Clean生命周期内置绑定的插件(详见Lifecycles Reference)
| 阶段 | 插件 |
|---|---|
| pre-clean | |
| clean | maven-clean-plugin:2.5:clean |
| post-clean |
Default生命周期内置绑定的插件(详见Plugin Bindings for default Lifecycle Reference)
| 阶段 | 插件 |
|---|---|
| process-sources | maven-resources-plugin:2.6:resources |
| compile | maven-compiler-plugin:3.1:compile |
| process-test-sources | maven-resources-plugin:2.6:testResources |
| test-compile | maven-compiler-plugin:3.1:testCompile |
| test | maven-surefire-plugin:2.12.4:test |
| package | maven-jar-plugin:2.4:jar maven-ejb-plugin:2.3:ejb maven-plugin-plugin:3.2:addPluginArtifactMetadata maven-war-plugin:2.2:war maven-ear-plugin:2.8:ear maven-rar-plugin:2.2:rar |
| install | maven-install-plugin:2.4:install |
| deploy | maven-deploy-plugin:2.7:deploy |
Site生命周期内置绑定的插件(详见Lifecycles Reference)
| 阶段 | 插件 |
|---|---|
| pre-site | |
| site | maven-site-plugin:3.3:site |
| post-site | |
| site-deploy | maven-site-plugin:3.3:deploy |
项目打包类型与生命周期内置绑定的插件
Maven项目的打包类型是由<packaging>xxoo</packaging>标签元素的值来决定的。可选值常见的有jar war pom,以及不太常用的maven-plugin ejb ear rar等。
Maven的Default生命周期为不同的打包类型内置绑定了不同的插件。而我们知道,项目构建过程的具体工作是由插件来完成的,因此不同的打包类型调用相同的Maven生命周期阶段,最终得以打出不同类型的软件包。
<packaging>pom</packaging>类型打包方式与生命周期内置绑定的插件
<phases>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>
<packaging>jar</packaging>类型打包方式与生命周期内置绑定的插件
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:resources
</process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
</compile>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
</process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
</test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
</test>
<package>
org.apache.maven.plugins:maven-jar-plugin:2.4:jar
</package>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>
<packaging>war</packaging>类型打包方式与生命周期内置绑定的插件
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:resources
</process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
</compile>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
</process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
</test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
</test>
<package>
org.apache.maven.plugins:maven-war-plugin:2.2:war
</package>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>