maven的生命周期时抽象的,这意味着生命周期本身不做任何实际的工作,实际的任务都交由插件来完成。每个构建步骤都可以绑定一个或多个插件行为,而且maven为都多数构建步骤编写并绑定了默认插件。例如针对编译的插件maven-compiler-plugin,针对测试的插件maven-surefire-plugin等。用户也可配置插件定制构建行为,甚至自己编写插件。
插件目标
插件以独立的构件形式存在,maven会在需要的时候下载并使用插件。
每个插件往往能完成多个任务。例如maven-dependency-plugin,它能分析依赖来源,列出依赖树等,这些功能聚集在一个插件里,每个功能就是一个插件目标。
maven-dependency-plugin有十多个模板,上述功能分别对应插件目标为dependency:list、dependency:tree。这是通用写法,冒号前面是插件前缀,冒号后面是插件目标。
插件绑定
maven生命周期的阶段与插件的目标相互绑定,以完成某个具体的构件任务。
内置绑定
maven为一些主要的生命周期阶段绑定了很多插件的目标。
| 生命周期阶段 | 插件目标 |
|---|---|
| pre-clean | |
| clean | maven-clean-plugin:clean |
| post-clean | |
| -------------- | -------------- |
| pre-site | |
| site | maven-site-plugin:site |
| post-site | |
| site-deploy | maven-site-plugin:deploy |
相对于clean和site生命周期来说,default生命周期与插件目标的绑定关系就显得复杂一些。default生命周期的阶段是插件目标的绑定关系由项目打包类型(jar、war、pom等)所决定。
常见的打包类型有jar、war、pom、maven-plugin、ear等,它们的default生命周期与插件目标的绑定关系请阅读官方文档,也可以从maven的命令行输出中看到项目构建过程执行了哪些插件目标。
自定义绑定
一个常见的例子是创建项目的源码jar包,内置的插件绑定没有涉及这一任务,需要用户自行配置。maven-source-plugin:jar-no-fork目标可以帮助我们完成。
<!-- 构建插件的基本配置 -->
<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>
有时候不通过phase元素配置生命周期阶段,插件目标也能绑定到生命周期中。是因为插件的目标在编写时就定义了默认的绑定阶段。
如果多个目标绑定到同一阶段,会按照这些插件声明的先后顺序执行。
插件配置
用户可以配置插件目标的参数,进一步调整插件目标所执行的任务。可以通过命令行和pom配置等方式来配置这些参数。
获取插件
基本上所有主要的maven插件都来自apache和codehaus。apache的更稳定些。
插件仓库
与依赖构件一样,插件构件同样基于坐标存储在maven仓库中。
解析插件前缀
maven-clean-plugin可以简写为clean。maven-compiler-plugin可以简写为compiler。
插件前缀与groupId:artifactId是一一对应的,这种匹配关系存储在仓库元数据中。这里的元数据为groupId/maven-metadata.xml,这个groupId是指插件仓库对应的groupId,如前文所述的apache(http://repo1.maven.org/maven2/org/apache/maven/plugins/)和codehaus(...)。也可以通过settings.xml让maven检查其他groupId上的插件仓库元数据。