7.4 插件绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。例如项目编译这一任务,它对应了default生命周期的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务。因此,将它们绑定,就能实现项目编译的目的,如图7-2所示。
图 7-2 生命周期阶段与插件目标绑定
7.4.1 内置绑定
为了能让用户几乎不用任何配置就能构建Maven项目,Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。
clean生命周期仅有pre-clean、clean和post-clean三个阶段,其中的clean与maven-clean-plugin:clean绑定。maven-clean-plugin仅有clean这一个目标,其作用就是删除项目的输出目录。clean生命周期阶段与插件目标的绑定关系如表7-1所示。
site生命周期有pre-site、site、post-site和site-deploy四个阶段,其中,site和maven-site-plugin:site相互绑定,site-deploy和maven-site-plugin:depoy相互绑定。maven-site-plugin有很多目标,其中,site目标用来生成项目站点,deploy目标用来将项目站点部署到远程服务器上。site生命周期阶段与插件目标的绑定关系如表7-2所示。
相对于clean和site生命周期来说,default生命周期与插件目标的绑定关系就显得复杂一些。这是因为对于任何项目来说,例如jar项目和war项目,它们的项目清理和站点生成任务是一样的,不过构建过程会有区别。例如jar项目需要打成JAR包,而war项目需要打成WAR包。
由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件目标的绑定关系由项目打包类型所决定,打包类型是通过POM中的packaging元素定义的,具体可回顾第5.2节。最常见、最重要的打包类型是jar,它也是默认的打包类型。基于该打包类型的项目,其default生命周期的内置插件绑定关系及具体任务如表7-3所示。
注意,表7-3只列出了拥有插件绑定关系的阶段,default生命周期还有很多其他阶段,默认它们没有绑定任何插件,因此也没有任何实际行为。
除了默认的打包类型jar之外,常见的打包类型还有war、pom、maven-plugin、ear等。它们的default生命周期与插件目标的绑定关系可参阅Maven官方文档:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bind-ings,这里不再赘述。
读者可以从Maven的命令行输出中看到在项目构建过程执行了哪些插件目标,例如基于account-email执行mvn clean install命令,可以看到如下输出,见代码清单7-2。
代码清单7-2 Maven输出中包含了生命周期阶段与插件的绑定关系
[INFO] ---------------------------------------------------------
[INFO] Building Account Email 1.0.0-SNAPSHOT
[INFO] ---------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.3:clean (default-clean) @ account-email ---
[INFO] Deleting file set: D:\git-juven\maven-book\code\ch-5 \account-email\target…
…
[INFO] - - - maven-resources-plugin:2.4.1:resources (default-resources) @ account-
email ---
[INFO] Using 'UTF-8 'encoding to copy filtered resources.
…
[INFO] - - - maven-compiler-plugin:2.0.2:compile (default-compile) @ accountemail
---
[INFO] Compiling 3 source files to D:\git-juven\maven-book\code\…
…
[INFO] --- maven-resources-plugin:2.4.1:testResources (default-testResources)
@ account-email ---
[INFO] Using 'UTF-8 'encoding to copy filtered resources.
…
[INFO] --- maven-compiler-plugin:2.0.2:testCompile (default-testCompile) @ account-
email ---
[INFO] Compiling 1 source file to …
…
[INFO] --- maven-surefire-plugin:2.4.3:test (default-test) @ account-email --
[INFO] Surefire report directory: D:\git-juven\maven-book\code\…
…
[INFO] --- maven-jar-plugin:2.2:jar (default-jar) @ account-email ---
[INFO] Building jar: D:\git-juven\maven-book\code\….
…
[INFO] --- maven-install-plugin:2.3:install (default-install) @ account-email
[INFO] Installing D:\git-juven\maven-book\code\…
…
[INFO] ---------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------
从输出中可以看到,执行的插件目标依次为maven-clean-plugin:clean、maven-resources-plu-gin:resources、maven-compiler-plugin:compile、maven-resources-plugin:testResources、maven-com-piler-plugin:testCompile、maven-surefire-plugin:test、maven-jar-plugin:jar和maven-install-plugin:install。我们知道,mvn clean install命令实际调用了clean生命周期的pre-clean、clean阶段,以及default生命周期的从validate至install所有阶段。在此基础上,通过对照表7-1和表7-3,就能从理论上得到将会执行的插件目标任务,而实际的输出完全验证了这一点。