生命周期 (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-clean
,clean
阶段和 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