maven之自定义插件

ops/2025/3/18 18:17:21/

写在前面

在使用maven肯定是离不开插件的,比如执行mvn clean或者时mvn compile其实运行的就是绑定的默认插件。虽然我们一般不需要来自定义插件,但是为了使用的过程中更加的清晰,来尝试自定义插件还是很有必要的,所以本文就一起来看下这部分内容。

1:hello world

想要定义插件,我们首先需要创建一个普通的maven项目,接着在pom中引入定义插件需要的依赖:

 <!--这个依赖引入了插件开发需要的相关基础类-->
<dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.0</version>
</dependency><!--这个依赖引入了插件开发需要的相关注解-->
<dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.4</version><scope>provided</scope>
</dependency>

接着我们来定义插件类:

java">@Mojo(name = "TimerPlugin")
public class TimerPlugin extends AbstractMojo {public void execute() throws MojoExecutionException, MojoFailureException {String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));getLog().info("timer plugin is running,current time is " + currentTime);}
}

抽象类AbstractMojo实现了接口org.apache.maven.plugin.Mojo,主要定义了逻辑执行方法execute,日志设置相关方法,其中execute是来写具体插件逻辑的。接着执行mvn clean install把插件安装到本地仓库,成功后就可以在仓库中看到我们的插件jar了:
在这里插入图片描述
接着就可以来使用了,两种方式,第一种是直接使用,第二种是绑定到maven的生命周期中。

1.1:直接使用

首先创建一个maven项目,然后执行mvn 插件groupId:插件artifactId[:插件版本]:插件目标名称:

PS D:\tmp\maven-plugin-demo> mvn org.example:maven-plugin-demo:TimerPlugin
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.example:maven-plugin-demo >--------------------
[INFO] Building maven-plugin-demo 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- maven-plugin-demo:1.0-SNAPSHOT:TimerPlugin (default-cli) @ maven-plugin-demo ---
[INFO] timer plugin is running,current time is 2025-03-14
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.456 s
[INFO] Finished at: 2025-03-14T16:55:27+08:00
[INFO] ------------------------------------------------------------------------

timer plugin is running,current time is 2025-03-14就是我们插件的输出了。

1.2:绑定到生命周期

需要在plugins标签中定义:

<build><plugins><plugin><groupId>org.example</groupId><artifactId>maven-plugin-demo</artifactId><version>1.0-SNAPSHOT</version><executions><execution><id>test1111</id><phase>compile</phase><goals><goal>TimerPlugin</goal></goals></execution></executions></plugin></plugins>
</build>

其中phase定义了要绑定的生命周期,goal是要执行的逻辑,即在@Mojo中定义的信息,定义后我们就可以在idea的maven面板中看到相关的插件信息了:
在这里插入图片描述
当我们执行compile时该插件就会执行了:
在这里插入图片描述

2:带参数的插件

需要使用到注解@Parameter,定义如下类:

java">@Mojo(name = "TimerPlugin")
public class TimerPlugin extends AbstractMojo {@Parameter(property = "timer.username" ,defaultValue = "moutory")private String userName;@Parameter(property = "timer.status", defaultValue = "happy")private String status;public void execute() throws MojoExecutionException, MojoFailureException {String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));getLog().info("timer plugin is running, current time is " + currentTime);getLog().info(String.format("hi %s ! Now you are %s",userName,status));}
}

安装插件后使用。
首先看命令行直接使用:

D:\tmp\maven-plugin-demo>mvn org.example:maven-plugin-demo:TimerPlugin -Dtimer.username=xxxxx -Dtimer.status=尽量保持平静
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.example:maven-plugin-demo >--------------------
[INFO] Building maven-plugin-demo 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- maven-plugin-demo:1.0-SNAPSHOT:TimerPlugin (default-cli) @ maven-plugin-demo ---
[INFO] timer plugin is running, current time is 2025-03-14
[INFO] hi xxxxx ! Now you are 尽量保持平静
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.473 s
[INFO] Finished at: 2025-03-14T17:37:16+08:00
[INFO] ------------------------------------------------------------------------

通过-D来传递参数。再来看下绑定到生命周期使用:

<build><plugins><plugin><groupId>org.example</groupId><artifactId>maven-plugin-demo</artifactId><version>1.0-SNAPSHOT</version><executions><execution><id>test</id><phase>compile</phase><goals><goal>TimerPlugin</goal></goals></execution></executions><configuration><userName>Jim</userName><status>good</status></configuration></plugin></plugins>
</build>

绑定到compile阶段,所以我们可以指定compile来看下效果:

PS D:\tmp\untitled1111> mvn compile
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< org.example:untitled1111 >----------------------
[INFO] Building untitled1111 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ untitled1111 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ untitled1111 ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-plugin-demo:1.0-SNAPSHOT:TimerPlugin (test) @ untitled1111 ---
[INFO] timer plugin is running, current time is 2025-03-14
[INFO] hi Jim ! Now you are good
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.245 s
[INFO] Finished at: 2025-03-14T17:40:08+08:00
[INFO] ------------------------------------------------------------------------

写在后面

参考文章列表

maven进阶——开发自定义插件 。


http://www.ppmy.cn/ops/166837.html

相关文章

基于 Docker 和 Flask 构建高并发微服务架构

基于 Docker 和 Flask 构建高并发微服务架构 一、微服务架构概述 &#xff08;一&#xff09;微服务架构的优点 微服务架构是一种将应用程序拆分为多个小型、自治服务的架构风格&#xff0c;在当今的软件开发领域具有显著的优势。 高度可扩展性&#xff1a;每个微服务可以独…

前端面试:ajax 和 xhr 是什么关系?

在前端开发中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;和 XHR&#xff08;XMLHttpRequest&#xff09;是两个密切相关但有些不同的概念。以下是对这两者的详细解释及其关系&#xff1a; 1. AJAX 定义&#xff1a;AJAX 是一个用于创建异步 we…

centos Supported Java versions are: [17, 21]

在 CentOS 系统中&#xff0c;支持的 Java 版本取决于你使用的 CentOS 版本以及你所使用的 Oracle JDK 或 OpenJDK 的版本。截至我所知的信息&#xff0c;截至2023年&#xff0c;CentOS 7 和 CentOS 8 都已经停止官方支持&#xff0c;并被各自的替代版本取代&#xff0c;即 Cen…

STM32 - 在机器人领域,LL库相比HAL优势明显

在机器人控制器、电机控制器等领域的开发&#xff0c;需要高实时性、精细化控制或者对代码执行效率、占用空间有较高要求。所以&#xff0c;大家常用的HAL库明显不符合要求。再加上&#xff0c;我们学习一门技术&#xff0c;一定要学会掌握底层的原理。MCU开发的底层就是寄存器…

代理导致虚拟机无法连接网络解决办法

虚拟机使用代理科学上网后&#xff0c;当关闭代理&#xff0c;虚拟机无法连接原来的网络解决方法 重启虚拟机网络服务器&#xff1a;ctrlaltt打开虚拟机命令终端&#xff0c;依次输入以下指令&#xff1a; sudo service network-manager stop sudo rm /var/lib/NetworkManager…

Java数据结构第二十二期:Map与Set的高效应用之道(一)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、Map和Set 1.1. 概念 二、搜索树 2.1. 概念 2.2. 查找操作 2.2. 插入操作 2.3. 删除操作 2.4. 性能分析 三、搜索 3.1. 概念及场景 3.2. 模型 四、Map 4.1. Map的说明 3.2. Map的使用 五…

虚幻FPS开发 day02:开枪以及光线追综

0.下面所有的操作都是基于day01的基础上开始的 1.开火音效 首先设置音效资产变量&#xff0c;在蓝图中动态的设置音效资产 绑定开火事件&#xff0c;在输入事件中设置鼠标左键按下事件 在代码中设置当鼠标左键按下时对应的槽函数&#xff0c; 绑定输入事件和槽函数之间的关系…

【每日学点HarmonyOS Next知识】上下拉列表、停止无限循环动画、页面列表跟随列表滑动、otf字体、日期选择

1、HarmonyOS 实现只需要保留上拉加载更多&#xff0c;但是不需要下拉刷新&#xff1f; Refresh通过参数refreshing判断当前组件是否正在刷新&#xff0c;可以控制该参数变化来触发下拉刷新&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5…