maven是当下最流行的项目管理工具,其丰富的插件为我们的工作带来了很大的便利。

但是在一些情况下,开源的插件并不能完全满足我们的需求,我们需要自己创建插件,本文就从0开始带大家一起创建自己的插件。

【命名规范】

  首先,官方的命名规范是maven-xxx-plugin,为了避免于官方冲突,我们可以将自己的插件命名为xxx-maven-plugin。

【创建插件项目】

本项目使用idea创建。

我们首先需要创建一个Mojo(Maven plain Old Java Object)工程,如下图:

然后填写我们的项目名以及groupId:

然后我们可以设置自己的maven目录和settings的目录:

然后咱们可以看到项目下有一个默认创建的类MyMojo:

该类继承 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。

类里面默认实现了一个方法,可以创建一个文件,咱们为了理解起来更简单一点,修改得更简单一些:

我们依次解释一下图中红框框住的四个部分:

    1. @goal------自定义 Maven 插件 Mojo 代码中唯一必须声明的标记,用来声明该 Mojo 的目标名称。
    2. @phase------默认将该目标绑定到 default 生命周期的某个阶段。

图中的生命周期为程序运行期间。

    1. 每个Mojo类都需要继承AbstractMojo ,并实现其execute()方法。
    2. 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 生命周期的某个阶段。

这样在配置使用该插件目标时就可以不声明 phase。

@requiresDependecyResolution<scope>

声明运行该
Mojo 之前必须解析哪些范围的依赖。

@requiresProject<true/false>

声明该目标是不是必须在一个 Maven 项目中运行,默认值是true。

@requiresDirectInvoction<true/false>

声明该目标是否只能使用命令行调用,默认值是 false,既可以在命令行中调用,也可以在 pom 中配置绑定生命周期阶段。

@requiresOnline<true/false>

声明
Maven 是不是必须是在线状态,默认值是 false。

@requiresReport<true/false>

声明是否要求项目报告已经生成,默认值是 false。

@aggregator

在多模块的
Maven 项目中,声明该目标是否只在顶层模块构建的时候执行。

@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
execute but there is no POM in this directory (D:\test\code-demo). Please
verify you invoked Maven from the correct directory. -> [Help 1]

此时,需要指定以下参数使插件可以脱离项目单独执行:

requiresProject = false

结果:

【demo地址】

以上,即是整个maven-plugin入门开发内容,为了方便大家查看学习,我把demo项目放到了我的github上,大家可以自行查看:

https://github.com/liufarui/code-demo

如何开发一个maven插件的更多相关文章

  1. 面试官:开发过Maven插件吗?我:开发过啊。。。

    写在前面 转眼间,今天已经是假期的第4天了.今天要给大家分享点啥呢?想了半天,想起了之前去某宝面试的情景.记得面试前自己基于Maven开发过一些简单实用的插件,而且在自己的本地环境中一直在使用,极大的 ...

  2. 开发一个shopify插件

       开发一个shopify插件,shopify商城可以安装该插件:当用户在商城下单后,插件把订单数据按照指定格式传给disruptsports服务器:   https://help.shopify. ...

  3. jQuery 开发一个简易插件

    jQuery 开发一个简易插件 //主要内容 $.changeCss = function(options){ var defaults = { color:'blue', ele:'text', f ...

  4. 开发一个jQuery插件——多级联动菜单

    引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...

  5. 如何开发一个 PyCharm 插件

    PyCharm 是很多 Python 开发者优先选择的 IDE,功能强大,跨平台,提供免费社区版,非常良心.如果你想自己给PyCharm添加一些功能怎么办呢?有两个办法: 通过提需求实现,到 JetB ...

  6. 开发一个maven脚手架

    写在前面 开发新项目就需要搭建新工程,但是搭建新工程的这个过程是非常繁琐浪费时间的,并且不可避免的需要踩坑.更可怕的是,如果是在一个团队中,每新起一个项目都由不同的开发人员去自定义的搭建工程结构,那么 ...

  7. 如何开发一个Jquery插件

    Jquery有两种开发插件的方法: 1.jquery.fn.extend(object); 2.jquery.extend(object); 第一种方法是给Jquery对象添加方法,jquery.fn ...

  8. 开发一个chrome插件:将百度搜索热点屏蔽掉!

    每次百度搜索,搜索结果的右边总是出现些乱七八糟的搜索热点(推的都是些什么玩意,高校替课和我有毛关系,几个悲伤的热点我用星号顶掉了). 强迫症想把它隐藏掉,我用的是chrome浏览器,受adblock( ...

  9. 如何开发和发布一个Vue插件

    前言 Vue 项目开发过程中,经常用到插件,比如原生插件 vue-router.vuex,还有 element-ui 提供的 notify.message 等等.这些插件让我们的开发变得更简单更高效. ...

随机推荐

  1. 发布MeteoInfo 1.2.8

    增加了对SYNOP数据的支持(功能从C#版移植过来).数据可以从这里下载:http://weather.cod.edu/digatmos/syn/SYNOP数据搞气象的人应该多少知道些,类似MICAP ...

  2. day10 Pyhton学习

    一.昨日内容回顾 函数: 定义:对功能或者动作的封装 def 函数名(形参): 函数体 函数名(实参) return:  返回,当程序运行到return的时候,终止函数的执行 一个函数一定拥有返回值 ...

  3. spring boot:spring security实现oauth2授权认证(spring boot 2.3.3)

    一,oauth2的用途? 1,什么是oauth2? OAuth2 是一个开放标准, 它允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像.照片.视频等), 在这个过程中无须将用户名和密码 ...

  4. linux(centos8):安装prometheus服务端/node_exporter客户端(prometheus 2.18.1)

    一,prometheus的用途 Prometheus是一个开源的系统监控和警报工具包 相比其他监控系统,它更适用于微服务的体系架构 它使用各种专用exporter,用来实现对硬件/存储/数据库/web ...

  5. nginx安全:配置网站图片防盗链

    一,为什么要做防盗链? 1,什么是盗链? 比如某人有一个A网站, 他不愿自己存储图片,(因为磁盘和带宽都有成本) 就在自己A网站的页面上直接插入B网站的图片, 从而为自己吸引流量,这就是盗链 2,为什 ...

  6. Jmeter入门(6)- 参数化

    一.什么是参数化 为什么要参数化? 在发送大量的请求时,键对值是写死的,每次请求都需要去修改,无法实现快速添加的需求.想要快速实现该需求,就需要用到参数化. 什么是参数化? 根据需求动态获取数据并进行 ...

  7. jqgrid与bootstrap样式结合问题

    还有个问题,就是 <link rel="stylesheet" href="../boot/grid/ui.jqgrid.css" type=" ...

  8. AppWidget使用方法

    手机桌面小组件 public class AppWidget extends AppWidgetProvider { @Override public void onUpdate(Context co ...

  9. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  10. win10 hyper-v的开启和关闭

    一.开启: 1. 控制面板->程序->启用或关闭Windows功能,Windows功能中勾选hyper-v功能 2. powershell中使用管理员权限运行下面的命令 bcdedit / ...