美文网首页
maven插件

maven插件

作者: 不知名的蛋挞 | 来源:发表于2018-09-30 09:49 被阅读21次

一个项目的生命周期如同一个人的生命周期(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 eclipse:eclipse,就是我们让maven唤起运行eclipse的插件,生成eclipse的项目文件。他们运行方式如此的相似,是因为他们本来就是同样的东西--mojo。

调用Maven插件目标

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

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

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

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

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

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

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

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

【内置绑定】

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

【自定义绑定】

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

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>attach-source</id>
                    <phase>package</phase><!-- 要绑定到的生命周期的阶段 -->
                    <goals>
                        <goal>jar-no-fork</goal><!-- 要绑定的插件的目标 -->
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    ……
</build>

相关文章

网友评论

      本文标题:maven插件

      本文链接:https://www.haomeiwen.com/subject/wlkdoftx.html