Maven插件

前言

Maven 有以下三个标准的生命周期:

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

每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。

我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 来实现的。

所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。

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

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

插件目标

对于 Maven 插件而言,为了提高代码的复用性,通常一个 Maven 插件能够实现多个功能,每一个功能都是一个插件目标,即 Maven 插件是插件目标的集合。我们可以把插件理解为一个类,而插件目标是类中的方法,调用插件目标就能实现对应的功能。

1、通用写法

插件目标的通用写法如下。

  • [插件名]:[插件目标名]


例如,maven-compiler-plugin 插件的 compile 目标的通用写法如下。

  • maven-compiler-plugin:compile

2、执行插件目标

使用 Maven 命令执行插件的目标,语法如下。

  • mvn [插件名]:[目标名]


例如,调用 maven-compiler-plugin 插件的 compile 目标,命令如下。

  • mvn compiler:compile

插件绑定

1、内置绑定

2、自定义绑定

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

2.1、修改插件版本

我们想要修改打包插件的版本,则只需要在项目的 POM 中 ,通过 build 元素的子元素 plugins,将 maven-jar-plugin 的版本做出修改即可。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.2</version>
            </plugin>
        </plugins>
    </build>

刷新pom.xml文件,再次查看idea maven工具,可发现其版本已经变为我们指定的版本:

2.2、输出自定义信息

我们想要在 clean 生命周期的 clean 阶段中显示自定义文本信息,则只需要在项目的 POM 中 ,通过 build 元素的子元素 plugins,将 maven-antrun-plugin:run 目标绑定到 clean 阶段上,并使用该插件输出自定义文本信息即可。

查看代码
 <build>
        <plugins>
            <!-- 绑定插件 maven-antrun-plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <!--自定义 id -->
                        <id>myclean</id>
                        <!--插件目标绑定的构建阶段 -->
                        <phase>clean</phase>
                        <!--插件目标 -->
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <!--配置 -->
                        <configuration>
                            <!-- 执行的任务 -->
                            <tasks>
                                <!--自定义文本信息 -->
                                <echo>清理阶段,和过往说再见...</echo>
                            </tasks>
                        </configuration>
                    </execution>               
                </executions>
            </plugin>
        </plugins>
    </build>

以上配置中除了插件的坐标信息之外,还通过 executions 元素定义了一些执行配置。executions 下的每一个 execution 子元素都可以用来配置执行一个任务。

execution 下各个元素含义如下:

  • id:任务的唯一标识。
  • phase:插件目标需要绑定的生命周期阶段【一个execution对应一个phase】。
  • goals:用于指定一组插件目标,其子元素 goal 用于指定一个插件目标。
  • configuration:该任务的配置,其子元素 tasks 用于指定该插件目标执行的任务。【参数tasks已弃用,请使用target代替】

 

如何知道自定义绑定的插件有哪些目标?

  ① 在 <goal></goal>标签体内使用代码补全:ctrl + 空格 【可能与中英文切换快捷键冲突】,可以看到两个值:help和run。

  ② 直接在idea右侧maven栏目中查看,如下图所示:

  

 

>>> 执行命令 mvn clean 或者点击 Lifecycle 中的 clean 【点击 Plugins 中的 clean:clean 无效】,结果如下:

查看代码
 [INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< org.example:maven-test >-----------------------
[INFO] Building maven-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-test ---
[INFO] Deleting C:\Daniel\WorkSpace\maven-test\target
[INFO] 
[INFO] --- maven-antrun-plugin:1.8:run (myclean) @ maven-test ---
[INFO] Executing tasks

main:
     [echo] 清理阶段,和过往说再见...
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.454 s
[INFO] Finished at: 2022-09-28T22:27:24+08:00
[INFO] ------------------------------------------------------------------------

>>> 再添加一个执行配置,并绑定生命周期的编译阶段

                    <!--再添加一个执行配置-->
                    <execution>
                        <id>msg</id>
                        <!--插件目标绑定的构建阶段 -->
                        <phase>compile</phase>
                        <goals>
                            <!--指定一组插件目标 -->
                            <goal>run</goal>
                            <goal>help</goal>
                        </goals>
                        <!--配置 -->
                        <configuration>
                            <!-- 执行的任务 -->
                            <target>
                                <echo>编译阶段,着眼于现在...</echo>
                            </target>
                        </configuration>
                    </execution>

执行结果如下:

查看代码
 [INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< org.example:maven-test >-----------------------
[INFO] Building maven-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-test ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-test ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-antrun-plugin:1.8:run (msg) @ maven-test ---
[INFO] Executing tasks

main:
     [echo] 编译阶段,着眼于现在...
[INFO] Executed tasks
[INFO] 
[INFO] --- maven-antrun-plugin:1.8:help (msg) @ maven-test ---
[INFO] Apache Maven AntRun Plugin 1.8
  Runs Ant scripts embedded in the POM

This plugin has 2 goals:

antrun:help
  Display help information on maven-antrun-plugin.
  Call mvn antrun:help -Ddetail=true -Dgoal=<goal-name> to display parameter
  details.

antrun:run
  Maven AntRun Mojo.
  This plugin provides the capability of calling Ant tasks from a POM by running
  the nested Ant tasks inside the <tasks/> parameter. It is encouraged to move
  the actual tasks to a separate build.xml file and call that file with an
  <ant/> task.


[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.734 s
[INFO] Finished at: 2022-09-28T22:55:26+08:00
[INFO] ------------------------------------------------------------------------

当插件目标绑定到生命周期的不同阶段时,其执行顺序由生命周期阶段的先后顺序决定。

如果多个目标绑定到同一个生命周期阶段,其执行顺序与插件声明顺序一致,先声明的先执行,后声明的后执行。

posted @ 2022-09-28 23:02  danielzzz  阅读(219)  评论(0编辑  收藏  举报