Maven:生命周期和插件。

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生命周期的内置插件绑定关系及具体任务如下所示。

生命周期阶段 插件目标 执行任务

process-resources

compile

process-test-resources

test-compile

test

package

install

deploy

maven-resources-plugin:resources

maven-compiler-plugin:compile

maven-reousrces-plugin:testResources

maven-compiler-plugin:testCompile

maven-surefire-plugin:test

maven-jar-plugin:jar

maven-install-plugin:install

maven-deploy-plugin:deploy

复制主资源文件至主输出目录

编译主代码至主输出目录

复制测试资源文件至测试输目录

编译测试代码至测试输出目录

执行测试用例

创建项目jar包

将项目输出构件安装到本地仓库

将项目输出构件部署到远程仓库

注意,上表只列出了拥有插件绑定关系的阶段,default生命周期还有很多其他阶段,默认他们没有绑定任何插件,因此也没有任何实际行动。

除了默认的打包类型jar之外,常见的打包类型还有war、pom、maven-plugin、ear等。

可以从Maven的命令行输出中看到在项目构建过程执行了哪些插件目标。

自定义绑定

除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上。这种自定义绑定方式能让Maven项目在构建过程中执行更多更富特色的任务。

一个常见的例子是创建项目的源码jar包,内置的插件绑定关系中并没有涉及这一任务,因此需要用户自行配置。maven-source-plugin可以帮助我们完成该任务,他的jar-no-fork目标能够将项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上,在执行完集成测试后和安装构建之前创建源码jar包。具体配置如下所示。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在POM的build元素下的plugins子元素中声明插件的使用,该例中用到的是maven-source-plugin,其groupId为org.apache.maven.plugins,这也是Maven官方插件的groupId,紧接着artifactId为maven-source-plugin,version为2.1.1。对于自定义绑定的插件,用户总是应该声明一个非快照版本,这样可以避免由于插件版变化造成的构建不稳定性。

上述配置中,除了基本的插件坐标声明外,还有插件执行配置,executions下每个execution子元素可以用来配置执行一个任务。该例中配置了一个id为attach-sources的任务,通过phrase配置,将其绑定到verify生命周期阶段上,再通过goals配置指定要执行的插件目标。至此,自定义插件绑定完成。

有时候,即使不通过phase元素配置生命周期阶段,插件目标也能够绑定到生命周期中去。例如,可以尝试删除上述配置中的phase一行,再次执行mvn verify,仍然可以看到maven-source-plugin:jar-no-fork得以执行。出现这种现象的原因是:有很多插件的目标在编写时已经定义了默认绑定阶段。可以使用maven-help-plugin查看插件详细信息,了解插件的默认绑定阶段。运行命令如下:

$ mvn help:describe-Dpulgin=org.apache.maven.plugins:maven-source-plugin:2.1.1-Ddetail

该命令输出对应的详细信息。

我们知道,当插件目标被绑定到不同的生命周期阶段的时候,其执行顺序会由生命周期阶段的现后顺序决定。如果多个目标被绑定到同一个阶段,他们的执行顺序会是怎样?答案很简单,当多个插件目标绑定到同一个阶段的时候,这些插件声明的先后顺序决定了目标的执行顺序。

猜你喜欢

转载自blog.csdn.net/en_joker/article/details/83819075