Maven 的生命周期就是为了对所有的构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。
Maven 定义了 3 个生命周期META-INF/plexus/components.xml
:
default
生命周期clean
生命周期site
生命周期
这些生命周期是相互独立的,每个生命周期包含多个阶段(phase)。并且,这些阶段是有序的,也就是说,后面的阶段依赖于前面的阶段。当执行某个阶段的时候,会先执行它前面的阶段。
执行 Maven 生命周期的命令格式如下:
mvn 阶段 [阶段2] ...[阶段n]
# default 生命周期
default
生命周期是在没有任何关联插件的情况下定义的,是 Maven 的主要生命周期,用于构建应用程序,共包含 23 个阶段。
<phases> <!-- 验证项目是否正确,并且所有必要的信息可用于完成构建过程 --> <phase>validate</phase> <!-- 建立初始化状态,例如设置属性 --> <phase>initialize</phase> <!-- 生成要包含在编译阶段的源代码 --> <phase>generate-sources</phase> <!-- 处理源代码 --> <phase>process-sources</phase> <!-- 生成要包含在包中的资源 --> <phase>generate-resources</phase> <!-- 将资源复制并处理到目标目录中,为打包阶段做好准备。 --> <phase>process-resources</phase> <!-- 编译项目的源代码 --> <phase>compile</phase> <!-- 对编译生成的文件进行后处理,例如对 Java 类进行字节码增强/优化 --> <phase>process-classes</phase> <!-- 生成要包含在编译阶段的任何测试源代码 --> <phase>generate-test-sources</phase> <!-- 处理测试源代码 --> <phase>process-test-sources</phase> <!-- 生成要包含在编译阶段的测试源代码 --> <phase>generate-test-resources</phase> <!-- 处理从测试代码文件编译生成的文件 --> <phase>process-test-resources</phase> <!-- 编译测试源代码 --> <phase>test-compile</phase> <!-- 处理从测试代码文件编译生成的文件 --> <phase>process-test-classes</phase> <!-- 使用合适的单元测试框架(Junit 就是其中之一)运行测试 --> <phase>test</phase> <!-- 在实际打包之前,执行任何的必要的操作为打包做准备 --> <phase>prepare-package</phase> <!-- 获取已编译的代码并将其打包成可分发的格式,例如 JAR、WAR 或 EAR 文件 --> <phase>package</phase> <!-- 在执行集成测试之前执行所需的操作。 例如,设置所需的环境 --> <phase>pre-integration-test</phase> <!-- 处理并在必要时部署软件包到集成测试可以运行的环境 --> <phase>integration-test</phase> <!-- 执行集成测试后执行所需的操作。 例如,清理环境 --> <phase>post-integration-test</phase> <!-- 运行任何检查以验证打的包是否有效并符合质量标准。 --> <phase>verify</phase> <!-- 将包安装到本地仓库中,可以作为本地其他项目的依赖 --> <phase>install</phase> <!-- 将最终的项目包复制到远程仓库中与其他开发者和项目共享 --> <phase>deploy</phase> </phases>
根据前面提到的阶段间依赖关系理论,当我们执行 mvn test
命令的时候,会执行从 validate 到 test 的所有阶段,这也就解释了为什么执行测试的时候,项目的代码能够自动编译。
# clean 生命周期
clean 生命周期的目的是清理项目,共包含 3 个阶段:
- pre-clean
- clean
- post-clean
<phases> <!-- 执行一些需要在clean之前完成的工作 --> <phase>pre-clean</phase> <!-- 移除所有上一次构建生成的文件 --> <phase>clean</phase> <!-- 执行一些需要在clean之后立刻完成的工作 --> <phase>post-clean</phase> </phases> <default-phases> <clean> org.apache.maven.plugins:maven-clean-plugin:2.5:clean </clean> </default-phases>
根据前面提到的阶段间依赖关系理论,当我们执行 mvn clean
的时候,会执行 clean 生命周期中的 pre-clean 和 clean 阶段。
# site 生命周期
site 生命周期的目的是建立和发布项目站点,共包含 4 个阶段:
- pre-site
- site
- post-site
- site-deploy
<phases> <!-- 执行一些需要在生成站点文档之前完成的工作 --> <phase>pre-site</phase> <!-- 生成项目的站点文档作 --> <phase>site</phase> <!-- 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 --> <phase>post-site</phase> <!-- 将生成的站点文档部署到特定的服务器上 --> <phase>site-deploy</phase> </phases> <default-phases> <site> org.apache.maven.plugins:maven-site-plugin:3.3:site </site> <site-deploy> org.apache.maven.plugins:maven-site-plugin:3.3:deploy </site-deploy> </default-phases>
Maven 能够基于 pom.xml
所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。