一、生命周期 & 阶段
生命周期是对所有构建过程的抽象和统一,总共抽象为三套不同的生命周期(clean、default、site),每个生命周期都包含不同的阶段。阶段之间是有顺序的,会顺序执行当前阶段及之前所有阶段。
- clean:清理项目
- pre-clean阶段
- clean阶段
- post-clean阶段
- default:构建项目,最核心的部分
- 编译项目主代码:包括复制resource和编译class
- 编译项目test代码:包括复制test resource和编译test class
- 打包
- 部署到远程仓库
- site:建立和发布项目站点
- pre-site:生成项目站点之前需要完成的工作
- site:生成项目站点文档
- post-site:生成项目站点之后需要完成的工作
- site-deploy:将生成的项目站点发布到服务器
二、插件 & 目标
Maven的核心仅仅定义了抽象的生命周期,具体的任务交由插件完成。Maven核心为部分生命周期阶段绑定了默认插件目标,因此无需手动绑定,就可以通过 mvn clean(mvn 阶段名称)的方式调用绑定插件目标,完成实际行为
- 生命周期是抽象的,其实际行为由插件完成
- 每个插件包括多个功能,每个功能就是一个插件目标
- 每个生命周期阶段可以绑定一个或多个插件目标
1)内置绑定
超级POM中为一些主要的生命周期阶段绑定了默认插件目标
- clean生命周期
生命周期阶段 | 插件目标 | 执行任务 |
pre-clean | 无 | |
clean | maven-clean-plugin:clean | 删除项目的输出目录 |
post-clean | 无 | |
- default生命周期
生命周期阶段 | 插件目标 | 执行任务 |
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 | 创建项目jar包 |
install | maven-install-plugin:install | 将项目输出构件安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构件部署到远程仓库 |
- site生命周周期
生命周期阶段 | 插件目标 | 执行任务 |
pre-site | 无 | |
site | maven-site-plugin:site | 生成项目站点 |
post-site | 无 | |
site-deploy | maven-site-plugin:deploy | 将项目站点部署至远程服务器 |
| | |
2)自定义绑定
用户可以选择将某个插件目标绑定到生命周期的某个阶段
- 在verify阶段(集成测试(post-integration-test)阶段之后,安装构件(install)阶段之前)创建源码jar包
<build>
<plugins>
<!-- 在verify阶段使用jar-no-fork插件目标将主代码打包成jar文件 -->
<plugin>
<!-- 插件的坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugins</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<!-- 生命周期阶段 -->
<phase>verify</phase>
<!-- 一个阶段可以绑定多个目标 -->
<goals>
<!-- 插件目标名称 -->
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 部分插件目标在编写已经定义了默认绑定阶段,因此可以不配置<executions>元素
3)查看插件信息
使用help插件的describe目标查看插件信息,-D指定参数值
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail
## 等同于
mvn org.apache.maven.plugins:maven-help-plugin:2.2:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail
4)插件前缀
可以将插件前缀作为访问插件的唯一标识,因此在第3点中可以直接使用前缀help代替maven-help-plugin插件