插件目标
Maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构建形式存在,Maven会在需要的时候下载并使用插件。
对于插件本身,为了能够复用代码,它往往能够完成多个任务。例如maven-dependency-plugin, 它能够基于项目依赖做很多事情。 它能够分析项目依赖, 帮助找出潜在的无用依赖;它能够列出项目的依赖树,帮助分析依赖来源;它能够列出项目所有已解析的依赖等等。 为每个这样的功能编写一个独立的插件显然是不可取的,因为这些任务背后有很多可以服用代码,因此,这些功能聚集在一个插件里,每个功能就是一个插件目标。
maven-dependency-plugin有十多个目标,每个目标对应了一个功能,上述提到的几个功能分别对应插件的目标为dependency:analyze, dependency:tree 和 dependency-list。 这是一种通用的写法,冒号前面是插件前缀,冒号后面是该插件的目标。类似地, 还可以写出compiler:compile(这是maven-compiler-plugin的compile目标) 和 surefire:test(这是maven-surefire-plugin的test目标)。
插件绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言, 是生命周期的阶段与插件目标的相互绑定,以完成某个具体的构建任务。例如项目编译这一任务,它对应了default生命周期的compile 这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务。因此,将它们绑定,就能实现项目编译的目的。
内置绑定
为了能让用户几乎不用任何配置就能构建Maven项目,Maven的核心为一些主要的生命周期阶段绑定了很多插件的目标。当用户通过命令行调用生命周期阶段的时候, 对应的插件目标就会执行相应的任务。
clean 生命周期仅有 pre-clean, clean 和 post-clean 三个阶段, 其中的clean 与 maven-clean-plugin:clean绑定。 maven-clean-plugin仅有clean这一目标, 其作用就是删除项目的输出目录。
site 生命周期有pre-site , site , post-site 和 site-deploy 四个阶段, 其中, site 和 maven-site-plugin:site 相互绑定, site-deploy 和 maven-site-plugin:deploy相互绑定。 maven-site-plugin有很多目标,其中, site目标用来生成项目站点, deploy目标用来将项目站点部署到远程服务器上。
相对于clean 和 site生命周期来说,default生命周期与插件目标的绑定关系就显得复杂一些。 这是因为对于项目来说,例如jar项目和war项目, 它们的项目清理和站点生成任务是一样的,不过构建过程会有区别。例如jar项目需要打成JAR包,而war项目需要打成WAR包。
由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件目标的绑定关系由项目打包类型决定,打包类型是通过POM中的packaging元素定义的。最常见,最重要的打包类型是jar, 它是默认的打包类型。基于该打包类型的项目, 其default生命周期的内置插件绑定关系及任务如下所示。
注意,上表中只列出了拥有插件绑定关系的阶段,default生命周期还有很多其他阶段,默认它们没有绑定任何的插件,因此也没有任何实际行为。
default生命周期与插件目标的绑定关系可参阅Maven官方文档:
注: 摘取自《Maven实战》