maven的插件以及与生命周期的绑定原理

    maven插件有哪些?                                        

        我们下载下来的maven安装包并不大,maven的主要工作都是由插件来完成的。Maven官方有两个插件列表,第一个列表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html。第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org/plugins.html 。

        打开本地仓库,定位到路径D:\programs\mvnrepo\repo\org\apache\maven\plugins,这个文件夹里面存放的都是maven的插件:

maven的插件以及与生命周期的绑定原理

     maven插件的目标                                                 

        每一个插件都有很多目标来组成,目标英文叫做goal,也有人把maven插件的目标叫做任务,这些目标负责着完成maven的phase指定的工作,也是这些目标和phase进行了绑定,都是一个意思,就是maven的插件是由很多被称为目标或者任务的东西组成的。那么这个目标又是什么呢?当我输入“package”这个phase命令的时候,都调用了哪些插件目标呢?

maven的插件以及与生命周期的绑定原理

上面图片中红框框住的就是插件名称,绿色框框住的就是插件的目标。那么一个插件又有哪些目标呢,大家可以打开上面给出的maven官方插件列表的网址http://maven.apache.org/plugins/index.html

maven的插件以及与生命周期的绑定原理

比如我点击compiler插件,进去的页面就可以看到compiler插件有哪些目标:

maven的插件以及与生命周期的绑定原理

    maven插件目标与maven生命周期phase的绑定                                              

        了解了插件有哪些以及每一个插件的目标这些概念之后,我们再来看看目标是怎么和maven生命周期中的phase绑定的。

maven对一些生命周期的阶段(即phase)默认绑定了插件目标,依据jar、war、pom等不同的打包方式,可能对应着不同的绑定关系,这些我们不需要太关注,只需要明白原理就可以了,这样才不会浑浑噩噩的去用maven,完全无脑拷贝的去用maven不是我追求的目标:

maven的插件以及与生命周期的绑定原理

上图用图形的方式说明了maven插件和maven生命周期phase的绑定关系。标红的字体是插件的前缀,每一个插件都有一个前缀,蓝色字体是插件的目标。关于maven插件前缀的介绍可以参见maven官网的前缀prefix介绍

    maven命令执行流程与原理分析                                              

        还有最后一个问题,当我在命令行输入“mvn install”或者在eclipse里面执行install的时候:

maven的插件以及与生命周期的绑定原理

这里的install是指的插件目标还是指的maven的phase名称。答案是都可以,什么意思呢?maven会把你输入的“install”当做phase来解析,找到了对应的phase,maven就会去找该phase绑定的插件目标,然后执行它。如果maven找不到你输入的命令,比如我输入的是:

maven的插件以及与生命周期的绑定原理

eclipse在phase中找不到“war:help”的时候,就把这个命令当做插件目标来解析。再然后,如果maven在插件目标中也找不到你所输入的命令呢?比如,你输入:

maven的插件以及与生命周期的绑定原理

那么此时maven就报错了,不过报错信息那时相当的有用,错误信息告诉了你这里应该输入什么,输入的格式应该是什么。下面是我输入help时的报错信息:

[ERROR] Unknown lifecycle phase "help". You must specify a valid lifecycle phase 
or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. 
Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, 
process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources,
 process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, 
 integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, 
 post-site, site-deploy. -> [Help 1]

意思就是:这里可以输入的东西有两种:

  1. 生命周期phase

  2. 目标,而目标的格式又有两种,分别是:

        2.1 <plugin-prefix>:<goal>

        2.2 <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>