Maven生命周期详解
一、生命周期的概念与意义
在项目构建时包含了清理、编译、测试、打包、验证、部署,文档生成等步骤,maven统一对其进行了一个抽象,抽象成了三个生命周期,以及对应的多个阶段。这么做的意义在是:
1、每个阶段都可以成为一个扩展点,可以采用不同的方式来实现,提高了扩展性与灵活性;
2、规范并且统一了maven的执行路径。
下图就是Maven默认的生命周期。
Maven默认的生命周期包括预编译、编译、编译测试类、构建、部署这些阶段。这里的每一个阶段都只是提供了一个扩展点,只是抽象出来,里面是没有一个具体的实现的。具体的实现是由插件来提供的,插件就可以提供多种多样的实现。比如说构建阶段我们有一个项目是Jar包,那肯定是用Jar包的实现方式构建,如果那个项目是War包,那肯定是用War包的方式去构建。这就是Maven生命周期的每一个阶段所存在的意义。就好像我们在做Java开发的时候我们抽象出一些接口出来,我们这些接口并没有一些具体的实现一样,接口是可以拥有多种实现方式的,然后在不同的场景中把不同的实现拿进来然后构成实现。这就是Maven生命周期的一个意义了。
二、maven三大生命周期与其对应的phase(阶段)
Maven一共包含三大生命周期,如下:
1、clean:清理生命周期,用于清理项目;
2、default:默认生命周期,用于编译、打包、测试、部署等;
3、site:站点文档生成,用于构建站点文档。
这里面最核心的就是default生命周期。这个default生命周期就完整的默认实现了项目打包的大部分过程。
生命周期(lifecycle) | 阶段(phase) | 描述(describe) |
---|---|---|
clean Lifecycle | pre-clean | 预清理 |
clean | 清理 | |
post-clean | 清理之后 | |
default Lifecycle | validate | 验证 |
initialize | 初始化 | |
generate-sources | ||
process-sources | ||
generate-sources | ||
process-sources | ||
compile | 编译 | |
process-classes | ||
generate-test-sources | ||
process-test-sources | ||
generate-test-resources | ||
process-test-resources | ||
test-compile | 编译测试类 | |
process-test-classes | ||
test | 执行测试 | |
prepare-package | 构建前准备 | |
package | 打包构建 | |
pre-integration-test | ||
integration-test | ||
post-integration-test | ||
verify | 验证 | |
install | 上传到本地仓库 | |
deploy | 上传到远程仓库 | |
site Lifecycle | pre-site | 准备构建站点 |
site | 构建站点 | |
post-site | 构建站点之后 | |
site-deploy | 站点部署 |
三、生命周期与插件的关系
生命周期的phase(阶段)组成了项目的完整过程,但这些过程具体由谁来实现呢?这就是插件,maven的核心代码量其实很少。因为它的大部分实现都是由插件来完成的。比如:test阶段就是由maven-surefire-plugin实现。在pom.xml中我们可以设置指定插件goal(目标)与phase(阶段)绑定,当项目构建到达指定phase(阶段)时,就会触发这些插件goal(目标)的执行。一个插件有时候会实现多个phase(阶段)。例如maven-compiler-plugin插件分别实现了compile和testCompile。
总结:
1、生命周期的阶段可以绑定具体的插件及目标
2、不同配置下同一个阶段可以对应多个插件和目标
3、phase==>plugin==>goal(目标)
四、生命周期与插件的默认绑定
如果在我们的项目当中并没有配置maven-compiler-plugin 插件,但当我们执行compile 阶段时一样能够执行编译操作,原因是maven 默认为指定阶段绑定了插件实现。其实这些默认绑定是在apache-maven-3.2.1\lib\maven-core-3.2.1.jar内定义的,解压这个jar的maven-core-3.2.1\META-INF\plexus路径下有一个default-bindings.xml文件,这个写了maven绑定的默认插件。例如:下图的default生命周期默认绑定的插件。(不同的项目类型 其默认绑定是不同的,这里只指列举了default为jar的默认绑定)