一、生命周期 & 阶段
生命周期是对所有构建过程的抽象和统一,总共抽象为三套不同的生命周期(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插件