Maven插件
前言
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- 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] ------------------------------------------------------------------------
当插件目标绑定到生命周期的不同阶段时,其执行顺序由生命周期阶段的先后顺序决定。
如果多个目标绑定到同一个生命周期阶段,其执行顺序与插件声明顺序一致,先声明的先执行,后声明的后执行。