如何开发一个maven插件
maven是当下最流行的项目管理工具,其丰富的插件为我们的工作带来了很大的便利。
但是在一些情况下,开源的插件并不能完全满足我们的需求,我们需要自己创建插件,本文就从0开始带大家一起创建自己的插件。
【命名规范】
首先,官方的命名规范是maven-xxx-plugin,为了避免于官方冲突,我们可以将自己的插件命名为xxx-maven-plugin。
【创建插件项目】
本项目使用idea创建。
我们首先需要创建一个Mojo(Maven plain Old Java Object)工程,如下图:
然后填写我们的项目名以及groupId:
然后我们可以设置自己的maven目录和settings的目录:
然后咱们可以看到项目下有一个默认创建的类MyMojo:
该类继承 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。
类里面默认实现了一个方法,可以创建一个文件,咱们为了理解起来更简单一点,修改得更简单一些:
我们依次解释一下图中红框框住的四个部分:
- @goal------自定义 Maven 插件 Mojo 代码中唯一必须声明的标记,用来声明该 Mojo 的目标名称。
- @phase------默认将该目标绑定到 default 生命周期的某个阶段。
图中的生命周期为程序运行期间。
- 每个Mojo类都需要继承AbstractMojo ,并实现其execute()方法。
- getLog()是Mojo类默认的日志操作方法,直接调用可以使其在控制台输出相应内容。
【使用插件】
在test-maven-plugin中执行:
mvn clean install |
执行成功之后,可以去本地库里面查看到生成的包:
然后我们打开另外一个项目,并在pom文件中添加:
<build> <plugins> <plugin> <groupId>com.github.liufarui</groupId> <artifactId>demo-maven-plugin</artifactId> <version>0.0.1-SNAPSHOT</version> </plugin> </plugins> </build> |
然后执行:
mvn clean package
这时我们可以在右侧maven管理中看到我们的插件:
双击即可运行,可以在控制台看到我们的运行结果:
其实就是简单地打印了一句话。
我们也可以在项目下执行(由于我们的项目名符合XXX-maven-plugin规范,所以可以省略maven-plugin):
mvn demo:hello |
也可以得到同样的效果。
完整的命令格式为:
mvn groupId:artifactId:version:goal |
即:
【Mojo配置方式】
Mojo的配置有两种方式:
一种是JavaDoc + Tag,即上面的示例代码所使用的方式。
另一种是注解,使用@Mojo, @Parameter等annotation来配置。
下面简单解释一下各个标记的含义:
@goal<name> |
自定义 Maven 插件 Mojo 代码中唯一必须声明的标记,用来声明该 Mojo 的目标名称。 |
@phase<name> |
默认将该目标绑定到 default 生命周期的某个阶段。 |
@requiresDependecyResolution<scope> |
声明运行该 |
@requiresProject<true/false> |
声明该目标是不是必须在一个 Maven 项目中运行,默认值是true。 |
@requiresDirectInvoction<true/false> |
声明该目标是否只能使用命令行调用,默认值是 false,既可以在命令行中调用,也可以在 pom 中配置绑定生命周期阶段。 |
@requiresOnline<true/false> |
声明 |
@requiresReport<true/false> |
声明是否要求项目报告已经生成,默认值是 false。 |
@aggregator |
在多模块的 |
@execute goal="<goal>" |
声明执行该目标之前,先执行指定的目标。 如果该目标是自己插件的另外一个目标,直接 goal="目标名"。 如果该目标是另外一个插件的目标,就需要写成 goal="目标前缀:目标名"。 |
@execute phase="<phase>" |
声明在执行该目标之前,Maven 先运行到当前生命周期的指定阶段。 |
@execute lifecycle="<lifecycle>"phase="<phase>" |
声明在执行该目标之前,Maven 运行到指定生命周期的指定阶段。 |
【使用注解开发Mojo】
首先添加依赖:
<dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>3.6.0</version> </dependency> |
需要指定maven-plugin-plugin的版本,否则有可能因为默认的maven-plugin-plugin版本过低,导致不能识别注解:
<build> <plugins> <!-- 指定maven-plugin-plugin版本,默认版本过低,可能无法识别注解 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.6.0</version> </plugin> </plugins> </build> |
然后创建新的类,继承AbstractMojo,使用注解,如下:
然后执行mvn clean install,并在hello-world项目中运行插件:
【问题】
在项目文件夹之外运行插件的时候,可能会遇到以下问题:
Goal requires a project to |
此时,需要指定以下参数使插件可以脱离项目单独执行:
requiresProject = false |
结果:
【demo地址】
以上,即是整个maven-plugin入门开发内容,为了方便大家查看学习,我把demo项目放到了我的github上,大家可以自行查看:
https://github.com/liufarui/code-demo
如何开发一个maven插件的更多相关文章
- 面试官:开发过Maven插件吗?我:开发过啊。。。
写在前面 转眼间,今天已经是假期的第4天了.今天要给大家分享点啥呢?想了半天,想起了之前去某宝面试的情景.记得面试前自己基于Maven开发过一些简单实用的插件,而且在自己的本地环境中一直在使用,极大的 ...
- 开发一个shopify插件
开发一个shopify插件,shopify商城可以安装该插件:当用户在商城下单后,插件把订单数据按照指定格式传给disruptsports服务器: https://help.shopify. ...
- jQuery 开发一个简易插件
jQuery 开发一个简易插件 //主要内容 $.changeCss = function(options){ var defaults = { color:'blue', ele:'text', f ...
- 开发一个jQuery插件——多级联动菜单
引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...
- 如何开发一个 PyCharm 插件
PyCharm 是很多 Python 开发者优先选择的 IDE,功能强大,跨平台,提供免费社区版,非常良心.如果你想自己给PyCharm添加一些功能怎么办呢?有两个办法: 通过提需求实现,到 JetB ...
- 开发一个maven脚手架
写在前面 开发新项目就需要搭建新工程,但是搭建新工程的这个过程是非常繁琐浪费时间的,并且不可避免的需要踩坑.更可怕的是,如果是在一个团队中,每新起一个项目都由不同的开发人员去自定义的搭建工程结构,那么 ...
- 如何开发一个Jquery插件
Jquery有两种开发插件的方法: 1.jquery.fn.extend(object); 2.jquery.extend(object); 第一种方法是给Jquery对象添加方法,jquery.fn ...
- 开发一个chrome插件:将百度搜索热点屏蔽掉!
每次百度搜索,搜索结果的右边总是出现些乱七八糟的搜索热点(推的都是些什么玩意,高校替课和我有毛关系,几个悲伤的热点我用星号顶掉了). 强迫症想把它隐藏掉,我用的是chrome浏览器,受adblock( ...
- 如何开发和发布一个Vue插件
前言 Vue 项目开发过程中,经常用到插件,比如原生插件 vue-router.vuex,还有 element-ui 提供的 notify.message 等等.这些插件让我们的开发变得更简单更高效. ...
随机推荐
- Monkey常用操作
原文:https://www.cnblogs.com/lauren1003/p/6193277.html 一.Monkey测试原理:Monkey是Android中的一个命令行工具,可以运行在模拟器里或 ...
- python保存图片
#coding=utf-8 import requests url ="https://images.pexels.com/photos/1181767/pexels-photo-11817 ...
- C++ 多线程 std::thread 使用总结
在C++ 11之前,官方并没有支持线程库.C++ 11通过标准库引入了对 thread 类的支持,大大方便了完成多线程开发的工作. std::thread 构造函数 (1)thread() noex ...
- 微信小程序学习心得
我们写小程序时都要跳转页面的,也会有底部导航来进行切换 这个时候就要介绍下窗口是怎样配置的 要在app.json文件里写一个tabBer对象 里面在定义一个list数组里面放我们定义的几个需要切换的页 ...
- nginx给consul集群配置负载均衡
upstream consul { server 127.0.0.1:8501; server 127.0.0.1:8502; server 127.0.0.1:8503; } server { li ...
- HBase进阶
date: 2020-10-26 15:43:00 updated: 2020-10-26 18:45:00 HBase进阶 1. 架构 master负责管理多个region server,一个reg ...
- BadBoy+JMeter应用过程中遇到的问题汇总
前几天对HTTPS协议的系统做压力测试,用LoadRunner录制脚本过程中,系统登录后跳转的页面一直加载不出来,试了很多办法没解决这个问题.转而利用BadBoy+JMeter进行压测.以下为在运用B ...
- 【总结】spring aop
1.aop简介 AOP的全称是Aspect Oriented Programming,面向切面编程.它的主要思想是在程序正常执行的某一个点切进去加入特定的逻辑.AOP框架中对AOP支持最完整的是Asp ...
- STM32入门系列-GPIO工作模式及LED电路原理
GPIO工作模式 由于GPIO内部的结构关系,决定了GPIO可配置成以下几种模式. 输入模式 在输入模式时,施密特触发器打开,输出被禁止.可通过输入数据寄存器GPIOx_IDR读取I/O状态.输入模式 ...
- 面试时说Redis是单线程的,被喷惨了!
Redis是单线程的,这话搁以前,是横着走的,谁都知道的真理.现在不一样,Redis 变了.再说这句话,多少得有质疑的语气来跟你辩驳一番.意志不坚定的,可能就缴械投降,顺着别人走了. 到底是什么样的, ...