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 @   danielzzz  阅读(224)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示