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] ------------------------------------------------------------------------
当插件目标绑定到生命周期的不同阶段时,其执行顺序由生命周期阶段的先后顺序决定。
如果多个目标绑定到同一个生命周期阶段,其执行顺序与插件声明顺序一致,先声明的先执行,后声明的后执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?