为了能让用户几乎不用任何配置就能构建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所示。
表7-1 clean生命周期阶段与插件
表7-2 site生命周期阶段与插件
相对于clean和site生命周期来说,default生命周期与插件目标的绑定关系就显得复杂一些。这是因为对于任何项目来说,例如jar项目和war项目,它们的项目清理和站点生成任务是一样的,不过构建过程会有区别。例如jar项目需要打成JAR包,而war项目需要打成WAR包。
由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件目标的绑定关系由项目打包类型所决定,打包类型是通过POM中的packaging元素定义的,具体可回顾第5.2节。最常见、最重要的打包类型是jar,它也是默认的打包类型。基于该打包类型的项目,其default生命周期的内置插件绑定关系及具体任务如表7-3所示。
表7-3 default生命周期的内置插件绑定关系及具体任务(打包类型:jar)
注意,表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_Bindings,这里不再赘述。
读者可以从Maven的命令行输出中看到在项目构建过程执行了哪些插件目标,例如基于account-email执行mvn clean install命令,可以看到如下输出,见代码清单7-2。
代码清单7-2 Maven输出中包含了生命周期阶段与插件的绑定关系
从输出中可以看到,执行的插件目标依次为maven-clean-plugin:clean、maven-resources-plugin:resources、maven-compiler-plugin:compile、maven-resources-plugin:testResources、maven-compiler-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,就能从理论上得到将会执行的插件目标任务,而实际的输出完全验证了这一点。