Loading...
墨滴

楼仔

2021/07/18  阅读:37  主题:橙心

【Maven系列2】生命周期与插件

讲解Maven的生命周期和插件,以及常用的命令。

Maven生命周期

三套生命周期

Maven 的生命周期并不是一个整体,Maven 拥有三套相互独立的生命周期:

  • clean:项目清理的处理
  • default(或 build):项目部署的处理
  • site:项目站点文档创建的处理

三套生命周期本身是相互独立的,用户可以仅调用 clean 生命周期的某个阶段,或者仅仅调用 default 生命周期的某个阶段,而不会对其他生命周期产生任何影响。例如,当用户调用 clean 生命周期的 clean 阶段的时候,不会触发 default 生命周期的任何阶段,反之亦然。

注:所以一般的打包命令都是 clean package xxxxx,先 clean 再 package,就是因为 clean 和 package 是在两个不同的生命周期里面。

clean生命周期

当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

当调用 pre-clean 时,只有 pre-clean 阶段得以执行;当调用 clean 的时候,pre-clean和clean阶段会得以顺序执行,以此类推。这是因为每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。

default生命周期

重点步骤如下表,这个需要掌握:

default的23个阶段,仅了解即可:

在开发环境中,使用下面的命令去构建、安装工程到本地仓库:

mvn install

这个命令在执行 install 阶段前,按顺序执行了 default 生命周期的阶段 (validate,compile,package,等等),我们只需要调用最后一个阶段,如这里是 install。

site生命周期

  • pre-site 执行一些在生成项目站点之前需要完成的工作。
  • site 生成项目站点文档。
  • post-site 执行一些在生成项目站点之后需要完成的工作。
  • site-deploy 将生成的项目站点发布到服务器上。

这个没用过,后面如果需要用的话,我再试试。

Maven插件

插件介绍

Maven 三套生命周期定义各个阶段不做任何实际工作,实际工作都是由插件来完成的,每个生命周期阶段都是由插件的目标来完成。在 pom 文件中声明如下(打包源码文件插件):

<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>

Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告

插件目标

一个插件有可能有多个功能、每个功能就是一个目标。比如 maven-dependency-plugin 有十多个目标,每个目标对应了一个功能。插件的目标为 dependency:analyze、dependency:tree和dependency:list。通用写法:冒号前面是插件前缀,冒号后面是插件的目标。比如 compiler:compile。

插件绑定

内置绑定

为实现快速构建,Maven 有一套内置的插件绑定。三套生命周期的插件绑定具体如下(其实是各个生命周期阶段与插件的目标的绑定)。其中 default 生命周期的构建方式会其打包类型有关、打包类型在POM中 packaging 指定。一般有 jar、war 两种类型。下面是默认绑定插件与生命周期关系图:

自定义绑定

自定义绑定允许我们自己掌控插件目标与生命周期的结合.以生成项目主代码的源码 jar 为例。使用到的插件和它的目标为:maven-source-plugin:jar-no-fork。将其绑定到 default 生命周期阶段 verify 上(可以任意指定三套生命周期的任意阶段)。

<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>

举个栗子

这个是项目中的示例:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.0.1</version>
        <executions>
            <execution>
                <id>attach-sources</id>
                <phase>package</phase>
                <goals>
                    <goal>jar-no-fork</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <!-- 不执行单元测试 -->
            <skip>true</skip>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
            <encoding>${project.build.sourceEncoding}</encoding>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <testSource>${java.version}</testSource>
            <testTarget>${java.version}</testTarget>
        </configuration>
    </plugin>
</plugins>

maven-source-plugin是对Maven工程的源码进行打jar包的插件。

但是我试过,我将它去掉,一样可以打包成功,应该是用的Maven的默认插件。

maven-surefire-plugin是maven里执行测试用例的插件,示例我们是跳过了单元测试:

maven-compiler-plugin用于指定JDK的编译版本插件,在pom.xml的属性配置文件中,我们指定的是1.8。

后记

不想写后记,今天周五,公司待会就去团建,要不是明天家里有事,我今天也想参加,结果。。。结果今天留公司值班,好心塞~~

欢迎大家多多点赞,更多文章,请关注微信公众号“楼仔进阶之路”,点关注,不迷路~~

楼仔

2021/07/18  阅读:37  主题:橙心

作者介绍

楼仔