Maven的生命周期就是为了对所有的构建过程进行统一和抽象。这个生命周期包括项目的清理、初始化、编译、测试、打包、集成测试、部署和站点生成等几乎所有的构建步骤。几乎所有项目的构建,都能映射到这样一个生命周期上。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务都由插件来完成。这种思想与设计模式的模板方法相似。
Maven的生命周期和插件机制一方面保证了所有Maven项目有一致的构建标准,另一方面又通过默认插件简化和稳定了实际项目的构建。此外,该机制还提供了足够的扩展空间,用户可以通过配置现有插件或者自行编写插件来自定义构建行为。
Maven拥有三套独立的生命周期,分别是clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site生命周期的目的是建立项目站点。
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的方式就是调用这些生命周期阶段。
生命周期前后阶段具有依赖关系,但三套生命周期本身是相互独立的。
clean生命周期的目的是清理项目,它包含三个阶段:
default生命周期定义了真正构建时所需要执行的所有步骤,它是所有生命周期中最核心的部分,其部分主要阶段如下:
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,包含以下阶段:
从命令行执行Maven任务的最主要的方式就是调用Maven的生命周期阶段。下面介绍一些常见的Maven命令与其执行的生命周期:
对于插件本身,为了能够复用代码,它往往能够完成多个任务。为每个功能写一个独立的插件显然是不可取的,因为这些任务背后有很多的可以复用的代码,因此,这些功能聚集在一个插件里,每个功能就是一个插件目标。
Maven生命周期与插件相互绑定,用以完成实际的构建任务。具体是生命周期阶段与插件目标的相互绑定,以完成某个具体的构建任务。
用户可以自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构件过程中执行更多更有特色的任务。
用户可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目的需求。
可以在Maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数。
有的参数的值从项目创建到项目发布都不会改变,或者很少改变,对于这种情况,在POM文件中一次性配置就显然比重复在命令行中输入要方便。
可以为某个插件任务配置特定的参数
基本上所有主要的Maven插件都来自Apache和Codehaus。
可以通过mvn命令激活生命周期阶段,从而执行那些绑定在生命周期阶段上的插件目标。但Maven还支持直接从命令行调用插件目标,Maven支持这种方式是因为有些任务不适合绑定在生命周期上。
与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中。但Maven会区别对待依赖的远程仓库与插件的远程仓库,当Maven需要的依赖在本地仓库不存在时,它会去配置的远程仓库查找,可是当Maven需要的插件在本地仓库不存在时,它不会去远程仓库寻找。
在POM中配置插件时,如果该插件时Maven的官方插件,就可以省略groupId配置。
但并不推荐这么做,因为这样可能让其他人感到费解。
在用户没有提供插件版本的情况下,Maven会自动解析插件版本。
Maven在超级POM中为所有核心插件设定了版本,超级POM是所有Maven项目的父POM,所有项目都继承这个超级POM的配置。因此即使用户不加任何配置,Maven使用核心插件的时候,它们的版本就已经确定了。
如果用户使用某个插件时没有设定版本,而这个插件又不属于核心插件,Maven就会去检查所有仓库中可用的版本,然后做出选择。
依赖Maven解析插件版本是不推荐度的做法,会有潜在的不稳定性。推荐应一直显式地设定版本,这也解释了为什么Maven要在超级POM中为核心插件设定版本。