Maven 生命周期

 

生命周期 (Build Lifecycle)

Maven 的核心概念基于 Build Lifecycle。Maven 有三个内建的 build lifecycle

Build Lifecycle Description
default handles project deployment
clean handles project cleaning
site handles the creation of project’s web site

生命周期中的阶段 (Build Phase)

  • Build lifecycle 由多个阶段组成
  • 阶段的执行是有序的,执行某个阶段,会先执行其前面的所有阶段

default 生命周期中的阶段

Phase Description
validate 验证项目是否正确并且所有必要的信息都可用。
initialize 初始化构建状态,例如设置属性或创建目录。
generate-sources 生成包含在编译阶段中源代码。
process-sources 处理源代码,例如过滤任意值。
generate-resources 生成包含在包中的资源。
process-resources 复制并处理资源文件到目标目录,为打包做准备。
compile 编译项目的源代码。
process-classes 处理编译生成的文件,例如对 Java classes 进行字节码优化。
generate-test-sources 生成包含在编译中的测试源代码。
process-test-sources 处理测试源代码,例如过滤任意值。
generate-test-resources 创建测试用的资源文件。
process-test-resources 复制并处理测试用的资源文件到目标目录。
test-compile 编译测试源代码到测试目标目录。
process-test-classes 处理测试代码编译生成的文件,例如对 Java classes 的优化。
test 使用合适的单元测试框架运行测试。这些测试不要求打包代码或部署代码。
prepare-package 在实际打包之前,执行必要的操作为打包做准备。
package 打包编译后的代码为可分发格式,例如 JAR。
pre-integration-test 执行集成测试之前所需的操作,如搭建环境。
integration-test 将包部署到可以运行集成测试的环境中。
post-integration-test 执行集成测试之后所需的操作,如清理环境。
verify 运行检查,验证包是否有效且符合质量标准。
install 将软件包安装到本地Maven库,可以用作本地其他项目的依赖。
deploy 将包部署在集成或发布环境,复制包到远程Maven库,与其他开发人员和项目共享。

clean 生命周期中的阶段

Phase Description
pre-clean 执行 clean 前需要完成工作
clean 清理上次构建生成的文件
post-clean 执行 clean 后需要完成工作

Maven 命令行

Maven 命令行用来执行 build lifecycle 中的 build phase,比如希望得到一个 Jar 包,那么运行 mvn package,希望进行单元测试,那么运行 mvn test。命令行格式为

mvn phase [phase2 ...]

例如

mvn clean package

该命令会依次执行 clean 生命周期中的 pre-cleanclean 阶段和 default 生命周期中的 validate, compile, test, package 阶段。

通常不直接从命令行调用以连字符 pre-*post-*process-* 命名的阶段,这些阶段产生的是构建中无用的中间结果。

Maven 插件

Maven 的 build phase 负责生命周期中的一个特定步骤,而这些步骤最终是由与该阶段绑定的 插件目标 (plugin goals) 来完成的。

  • 一个 plugin goal 代表一个具体任务 (比 build phase 粒度更细)
  • plugin goal 可以绑定到零或多个 build phases
  • 没有绑定到任何 build phase 的 plugin goal 可以在命令行被直接调用,执行顺序依据命令行中的 build phase(s) 和 plugin goal(s) 的出现顺序
  • 如果一个 plugin goal 绑定到多个 build phases,在这些构建阶段这个插件目标都会被调用

此外,如果一个 build phase 没有绑定任何 plugin goal,这个构建阶段将不会被执行。

Maven 已经为一些主要的 build phases 内置绑定了 plugin goal,这样用户几乎不用任何配置就可以构建一个Maven项目。

clean build lifecycle 中的内置插件绑定

Phase plugin:goal
pre-clean  
clean maven-clean-plugin:clean
post-clean  

default build lifecycle 中的内置插件绑定

Phase plugin:goal
process-resources maven-resources-plugin:resources
compile maven-compiler-plugin:compile
process-test-resources maven-resources-plugin:testResources
test-compile maven-compiler-plugin:testCompile
test maven-surefire-plugin:test
package maven-jar-plugin:jar
install maven-install-plugin:install
deploy maven-deploy-plugin:deploy

查看 default lifecycle plugin bindings 了解详细信息

从命令行调用插件目标

使用 mvn -h 得到命令行格式

mvn [options] [<goal(s)>] [<phase(s)>]

比如获取项目依赖树,使用如下 plugin:goal 命令

mvn dependency:tree

Maven test 插件接受一个 skipTests 属性,设置为 true 可以跳过测试阶段

mvn package -DskipTests

参考文档