maven插件

maven插件_第1张图片

一个项目的生命周期如同一个人的生命周期(lifecycle),分为多个阶段(phase),如3岁前是幼儿期,4-22岁是幼年期,23-53是中轻年期,51-70是老年期。而每个阶段(phase)我们又会有不一样的目标(goal),比如幼儿期,我们的目标(goal)是喝奶,幼年期的目标(goal)是读书、长大,中年期的目标是结婚生子等等等等。这些组成我们人生的杯具。但是我们作为一个杯具的执行者(mojo),还得一步一步的去走我们的各个阶段,实现我们的各个目标。

项目都有标准的生命周期,编译前检查、资源生成、编译、部署、发布等等。但是每个项目又是如此不同,我们怎样改变我们的项目,使得这一个个的杯具有所不同呢?我们可以使用maven的插件和编写maven的插件来实现。比如我们想在编译前,去读取一台网络设备的配置;再或则需要收集其他资源等等。maven插件让我们项目丰富多彩,跟我们人生的杯具一样,请让我们的杯具与众不同。

Maven的插件

Maven的生命周期是对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。而在执行这些阶段时,实际的工作还是由插件来完成的。这种思想与设计模式中的模板方法非常相似。

比如我们在运行:maven install的时候,到底运行了什么?我们让maven执行默认生命周期中的一个阶段(phase),这个阶段叫install,而这个阶段默认绑定了一个目标(goal),目标的名称也叫install,也就是说我们让maven唤醒项目的一次install目标,即执行maven install:install。maven会根据默认的生命周期阶段,先执行先前的阶段(validate,initialize...),然后执行编译和安装。

maven插件_第2张图片

插件的运行方式类似,如执行maven eclipse:eclipse,就是我们让maven唤起运行eclipse的插件,生成eclipse的项目文件。他们运行方式如此的相似,是因为他们本来就是同样的东西--mojo。

调用Maven插件目标

用户可以通过以下两种方式调用Maven插件目标。

【将插件目标与生命周期阶段绑定】

Maven的生命周期是抽象的,实际需要插件来完成任务,这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。

maven插件_第3张图片

插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已。

细心的同学可能会问插件目标是什么呢,为什么不直接绑定到插件上。这是因为一个插件往往有多个功能,而每一个功能就是一个插件目标。回到文章开头提到的问题,像mvn archetype:create这样的命令,archetype:create实际上就是一个插件目标,mvn archetype:create这条命令会直接执行指定的插件目标,并不会执行其它任何的插件目标,这和执行生命周期阶段不一样。

【直接在命令行指定要执行的插件目标】

例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。

将插件目标与生命周期阶段绑定

【内置绑定】

Maven已经事先将很多核心插件绑定到对应的阶段,这样用户几乎不用配置就有构建Maven项目。Maven的内置绑定如下:

maven插件_第4张图片

【自定义绑定】

用户可以根据需要将任何插件目标绑定到任何生命周期的阶段,如:将maven-source-plugin的jar-no-fork目标绑定到default生命周期的package阶段,这样,以后在执行mvn package命令打包项目时,在package阶段之后会执行源代码打包,生成如:ehcache-core-2.5.0-sources.jar形式的源码包。


    
        
            org.apache.maven.plugins
            maven-source-plugin
            2.2.1
            
                
                    attach-source
                    package
                    
                        jar-no-fork
                    
                
            
        
    
    ……

你可能感兴趣的:(maven插件)