Maven 的 Lifecycle 和 plugins
maven是基于构建生命周期(build lifecycle)的中心概念产生的。其中有三个内建(built-in)的构建生命周期default, cleansite.
default用于项目的部署,clean用于清理项目,site用于项目建站。

maven - 图1

build lifecycle基础

每个构建生命周期(build lifecycle)由不同阶段(phrase)组成

default的生命周期,由以下主要phrase组成(图1)。这些生命周期的阶段按序执行,最终实现default的生命周期。完整的列表见(图2):链接
image.png
图1 部分大的phrase
image.png
图2 default的部分完整列表
maven - 图4
图3 三个内建构建生命周期的主要phrase

使用命令行执行阶段(phrase)

如执行

  1. mvn package

时,会执行package以及之前的所有phrase,及validatecompiletest,最后执行package

一个构建阶段(phrase)由插件目标(Plugin Goals)组成

通过声明插件目标(Plugin Goals)来具体说明每个phrase如何进行。

一个goal可以绑定多个phrase,一个phrase也可以绑定多个goal。当执行某个phrase时,会同步执行绑定的goals。如果phrase没有绑定goal,那将无法执行phrase。如果goal没有绑定phrase,是可以单独执行的。

有些phrase不会经常在命令行调用

前缀有-的phrase,不会经常被手动调用,因为这些是build的中间过程。如pre-, post-, or process-*

自定义build的生命周期

Package打包

项目可以打包成多种方式,如jar, war, ear 和pom,如果打包成jar,那么default的各个phrase将会被绑定这些goals
image.png
如果打包成pom形式,那只会绑定install 和deploy两个phrase
image.png
没有绑定goalphrase如上文所说不会被执行。

插件Plugin

第二个控制phrase 的goal 的方法是配置plugin。Plugin向maven提供了一系列的goals,每个goal可以理解为该插件的一种能力。如Compiler插件有两个goal,也即两种能力:compile and testCompile。
插件包含有指明了phrase和goal的绑定信息,当添加插件时,不能只添加插件,还要指明运行哪个goal。


If more than one goal is bound to a particular phase, the order used is that those from the packaging are executed first, followed by those configured in the POM. Note that you can use the element to gain more control over the order of particular goals.

如果一个phrase被绑定了多个goal,那么执行顺序是什么呢?先执行打包的goal,再执行POM中配置的(你可以用标签来配置多个goal)
如下配置了modello:java,即运行modello-maven-pluginjava goal。默认它会运行在generate-sources的phrase。

  1. ...
  2. <plugin>
  3. <groupId>org.codehaus.modello</groupId>
  4. <artifactId>modello-maven-plugin</artifactId>
  5. <version>1.8.1</version>
  6. <executions>
  7. <execution>
  8. <configuration>
  9. <models>
  10. <model>src/main/mdo/maven.mdo</model>
  11. </models>
  12. <version>4.0.0</version>
  13. </configuration>
  14. <goals>
  15. <goal>java</goal>
  16. </goals>
  17. </execution>
  18. </executions>
  19. </plugin>
  20. ...

image.png
你可以在<execution>中配置要执行的goal,也可以多次运行不同配置的同一个goal,当给出多个 <execution>时,会按照POM中配置的顺序执行。


指定goal在哪个phrase中运行
如果你有一个goal display:time,希望打印当前时间,你可以通过<phase>指定它在哪个phrase中执行:

  1. ...
  2. <plugin>
  3. <groupId>com.mycompany.example</groupId>
  4. <artifactId>display-maven-plugin</artifactId>
  5. <version>1.0</version>
  6. <executions>
  7. <execution>
  8. <phase>process-test-resources</phase>
  9. <goals>
  10. <goal>time</goal>
  11. </goals>
  12. </execution>
  13. </executions>
  14. </plugin>
  15. ...