要知道Maven命令执行的内部流程,首先要了解Maven生命周期
1 生命周期简介
Maven有三套相互独立的生命周期,分别是:
- Clean Lifecycle(Clean生命周期) :构建之前进行清理工作
- Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等
- Site Lifecycle :生成项目报告,站点,发布站点
三套生命周期,即可单独调用,也可组合调用
2 生命周期阶段(Phase)
2.1 每套生命周期都由一组阶段(Phase)组成
2.2 Clean生命周期的3个阶段
阶段 | 描述 |
---|---|
pre-clean | 执行需要在clean之前完成的工作 |
clean | 移除所有上一次构建生成的文件 |
post-clean | 执行需要在clean之后完成的工作 |
mvn clean 命令中的clean就是在执行clean阶段
2.3 Site生命周期的4个阶段
阶段 | 描述 |
---|---|
pre-site | 执行需要在生成站点文档之前完成的工作 |
clean | 生成项目站点文档 |
post-site | 执行需要在生成站点文档之后完成的工作,并且为部署做准备 |
site-deploy | 将生成的站点文档部署到指定服务器 |
2.4 Default生命周期的23个阶段:
生命周期阶段 | 描述 |
---|---|
validate | 验证项目是否正确,且所有必要信息可用于完成构建过程 |
initialize | 建立初始化状态,例如:设置属性,创建目录 |
generate-sources | 自动生成一些源代码,然后包含在项目代码中一起编译 |
process-sources | 处理源代码,例如:源码中占位符替换 |
generate-resources | 生成资源文件,例如:配置文件中占位符替换 |
process-resources | 将资源文件拷贝到目标目录,准备打包阶段 |
compile | 编译该项目的源代码 |
process-classes | 从编译生成的文件提交处理,例如:Java类的字节码增强/优化 |
generate-test-sources | 自动化生成测试代码 |
process-test-sources | 处理测试代码,比如过滤一些占位符 |
generate-test-resources | 生成测试用的资源文件 |
process-test-resources | 拷贝测试用的资源文件到目标目录 |
test-compile | 编译测试源代码到测试目标目录 |
process-test-classes | 处理测试代码文件编译生成的文件 |
test | 运行测试使用合适的单元测试框架(JUnit) |
prepare-package | 在打包之前进行准备工作,例如:处理package的版本号 |
package | 将代码进行打包,比如jar包 |
pre-integration-test | 完成执行集成测试之前所需操作。例如,设置所需的环境 |
integration-test | 将package部署到一个环境中以运行集成测试 |
pre-integration-test | 完成集成测试已全部执行后所需操作。例如,清理环境 |
verify | 运行任何检查,验证包是有效的,符合质量审核规定 |
install | 将包安装到本地存储库,它可以用作当地其他项目的依赖 |
deploy | 复制最终的包到远程仓库与其他开发者和项目共享 |
2.5 阶段特点
- 运行某个阶段时,它之前的所有阶段都会被运行
mvn clean 等同于 mvn pre-clean clean
mvn post-clean 等同于 mvn pre-clean clean post-clean
3 plugin与goal
3.1 plugin相当于一系列goal集合(个人见解)
3.2 goal
maven运行某阶段(phase),其实就是在运行绑定在该阶段(phase)上的一些plugin goal
goal可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase己经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中
一个未绑定goal的phase是没有任何意义的
例
clean phase默认绑定clean:clean
clean(plugin):clean(goal)
maven clean 就是 执行clean(plugin)的clean(goal)
- 也可直接执行插件的goal
例
mvn clean:clean
就是直接执行clean插件的clean(goal)
3.3 如何配置plugin
插件可自由绑定在任意阶段
此处以生成源码jar的插件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</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>
根据配置可以看出,将生成源码jar的goal绑定在verify阶段上,此时只需运行mvn verify即可生成源码jar
如果在命令中执行插件,使用-Dkey=value可进行插件设置
mvn install -Dmaven.test.skip=true
就是在执行install时,跳过test
插件与依赖一样,也存在仓库中
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>