Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。本文参考官方文档后使用archetype创建,手动创建太麻烦。

  1. 创建创建项目
    选择maven-archetype-mojo

    创建的项目结构如下

    这里要理解一个术语:mojo,就是Maven Plain Old Java Object,也就是一个普通的Java类,我们写的插件主要是实现AbstractMojo,而AbstractMojo只有一个

    public void execute()

    我的pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.oseye</groupId>
    <artifactId>MvnPluginDemo</artifactId>
    <packaging>maven-plugin</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>MvnPluginDemo Maven Mojo</name>
    <url>http://maven.apache.org</url>
    <dependencies>
    <dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-plugin-api</artifactId>
    <version>2.0</version>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
    </dependency>
    </dependencies>
    </project>
  2. 实现execute
    我们修改MyMojo.java的代码,来做一个非常简单的插件:

    package net.oseye;
    
    import org.apache.maven.plugin.AbstractMojo;
    import org.apache.maven.plugin.MojoExecutionException;
    /**
    * @goal oseye
    */
    public class MyMojo extends AbstractMojo{
    public void execute()throws MojoExecutionException
    {
    getLog().info("这是一个测试插件,goal是oseye");
    }
    }
    • getLog()获取的是AbstractMojo内部的log,类型是:org.apache.maven.plugin.logging.Log;至少在Mojo的开发中,不要使用其他的Log基础设施;
    • @goal标注,goal是maven里定义任务的最小单元,它可以单独,也可以挂在phase上,一个phase可以挂多个goal;这里是单独的;
    • 更多标注信息请参考官方文档
  3. 部署&执行
    部署插件到本地仓库

    mvn install

    要执行,首先需要在pom.xml或setting.xml中配置

      <build>
    <plugins>
    <plugin>
    <groupId>net.oseye</groupId>
    <artifactId>MvnPluginDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    </plugin>
    </plugins>
    </build>

    插件执行的命令格式

    mvn groupId:artifactId:version:goal

    如果是单个的goal可以省略version,执行

    mvn net.oseye:MvnPluginDemo:oseye

    可以看到输出中有

    [INFO] 这是一个测试插件,goal是oseye

  4. 使用简单命令执行
    如果你的artifacitId符合格式 ${prefix}-maven-plugin 或 maven-${prefix}-plugin,可以在你的settings.xml配置文件中加上

    <pluginGroups>
    <pluginGroup>net.oseye</pluginGroup>
    </pluginGroups>

    现在可以这样执行

    mvn MvnPluginDemo:oseye

    而我的Demo没有按照上述格式配置,更多格式信息请参考官方

  5. @execute
    这个标注是有三种方式:

    @execute phase="" lifecycle=""
    @execute phase=""
    @execute goal=""

    package net.oseye;
    
    import org.apache.maven.plugin.AbstractMojo;
    import org.apache.maven.plugin.MojoExecutionException;
    /**
    * @goal oseye
    * @execute phase="compile"
    */
    public class MyMojo extends AbstractMojo{
    public void execute()throws MojoExecutionException
    {
    getLog().info("这是一个测试插件,goal是oseye");
    }
    }

    这个示例表示当maven执行goal时,先把项目build到compile阶段后在执行goal。

  6. @phase
    这个标注表示默认的phase,如:

    package net.oseye;
    
    import org.apache.maven.plugin.AbstractMojo;
    import org.apache.maven.plugin.MojoExecutionException;
    /**
    * @goal oseye
    * @phase validate
    */
    public class MyMojo extends AbstractMojo{
    public void execute()throws MojoExecutionException
    {
    getLog().info("这是一个测试插件,goal是oseye");
    }
    }

    这个goal默认的是绑定validate阶段,但这个不能自动在validate阶段执行这个goal,必须配置:

     <build>
    <plugins>
    <plugin>
    <groupId>net.oseye</groupId>
    <artifactId>MvnPluginDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <executions>
    <execution>
    <goals>
    <goal>oseye</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>

    这是执行

    mvn compile

    首先是执行compile之前的phase,其中就有validate,因为配置中没有绑定phase,所以就默认validate。当执行到validate时就执行这个goal。但如果配置了

     <build>
    <plugins>
    <plugin>
    <groupId>net.oseye</groupId>
    <artifactId>MvnPluginDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <executions>
    <execution>
    <phase>compile</phase>
    <goals>
    <goal>oseye</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>

    那么就是把这个goal绑定了compile阶段。

  7. 参数
    插件可以接受从配置文件注入的数据,这里还是使用标注,格式是:

    @parameter expression="${aSystemProperty}" default-value="${anExpression}"

    插件代码

    package net.oseye;
    
    import org.apache.maven.plugin.AbstractMojo;
    import org.apache.maven.plugin.MojoExecutionException;
    /**
    * @goal oseye
    * @phase validate
    */
    public class MyMojo extends AbstractMojo{
    /**
    * @parameter expression=”${oseye.words}” default-value=”goodBye to you!”
    */
    private String words;
    public void execute()throws MojoExecutionException
    {
    getLog().info("这是一个测试插件,goal是oseye"+words);
    }
    }

    配置

     <build>
    <plugins>
    <plugin>
    <groupId>net.oseye</groupId>
    <artifactId>MvnPluginDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <executions>
    <execution>
    <phase>compile</phase>
    <goals>
    <goal>oseye</goal>
    </goals>
    <configuration>
    <words>goodbye everyone</words>
    </configuration>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>

    输出

    [INFO] 这是一个测试插件,goal是oseyegoodbye everyone

    插件只有能够配置传参才具有生产意义。

自己动手编写Maven的插件的更多相关文章

  1. 自己动手编写一个VS插件(五)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...

  2. 自己动手编写一个VS插件(七)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...

  3. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  4. 自己动手编写一个VS插件(八)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 利用业余时间继续开发一个VS插件.我要开发的插件是一个代码库插件,主要是用于积累我平时要使用的代码.在之前我已经实现了 ...

  5. 自己动手编写一个VS插件(六)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇中我们已经实现了创建和显示一个工具栏出来,它的效果图是这样的: 现在我们实现一些简单功能,具体就是单击按钮弹出一 ...

  6. 自己动手编写vue插件

    一.为什么要自己动手写插件呢,原因有二: 其一:是因为最近产品了提了一个在web端接收,消息通知的需求,产品要求在若干个页面内如果有消息,就要弹出消息弹窗展示给用户,略加思索之后,第一反应就是写个消息 ...

  7. 动手编写插件-javascript分页插件

    原来公司用的报表分页插件是C#编写的服务器插件,需要前后台交互,而且不支持ajax. 经过一段时间折腾,我编写了一个轻便的jquery分页插件,支持ajax.下面是插件代码 /* 插件名称:报表分页 ...

  8. IDEA集成有道翻译插件/maven帮助插件/mybatis插件

    (一)IDEA集成有道翻译插件:https://www.cnblogs.com/a8457013/p/7814335.html 插件下载地址:http://plugins.jetbrains.com/ ...

  9. OWIN系列之自己动手编写中间件

    一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. 2.OWIN.dll介绍 使用反编 ...

随机推荐

  1. Visual Studio 2015的安装与基本使用

    为什么要使用Visual Studio 2015? 它是中文的.界面友好.自动补全.实时语法错误提示(上图中波浪线部分).单步调试……最重要的社区版是免费的!所以你不必再使用破解的.老旧的的不兼容现代 ...

  2. 我用Cocos2d-x模拟《Love Live!学院偶像祭》的Live场景(二)

    上一章分析了Live场景中各个元素的作用,这一章开始来分析最关键的部分——打击物件的实现. 上一章放出的视频很模糊,先来看一个清晰版的复习一下:http://www.bilibili.com/vide ...

  3. Js中Array数组学习总结

    第一次写博客...有点方... 小白一枚(是真的小白),自学前端,下面来说说我在学习过程中总结的一些数组操作,如果说哪有错误,请各位大神多多指出,小的虚心接受. 引用类型分为Object类型(所谓的对 ...

  4. 求求别再这么用log4x了

    sl4j或者log4j中,推荐的记录方式是: private Logger log = Logger.getLogger(getClass()); //或者 private static final ...

  5. Postman编程

    Postman常用Api Postman像jmeter一样提供前置处理脚本和后置处理脚本.脚本主要使用JavaScript语法,并内置提供了一些js代码库,提供了一些内置对象和方法. 参考:https ...

  6. CodeForces462B

    Appleman and Card Game Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & % ...

  7. 类似qq空间的无限回复怎么实现??

    在开发网站的时候遇到这样一个问题,下面是自己的一些思路: 1.把数据库简单的设计出来了 2.这是自己写的简单的例子 3.图表形式 1:   1.发表一篇文章 2:  2给1评论 3:  3给2评论 2 ...

  8. 扩展jquery插件的方法

    方法1.通过一个简单的.jQuery函数prototype属性的别名(jquery.fn进行扩展) jQuery.fn.newStuff = function(){ console.log(" ...

  9. 代码神器Atom,最常用的几大插件,你值得拥有。

    作者:魔洁 atom常用插件 atom插件安装File>Settings>intall搜索框输入插件名,点击Packages搜索,搜索出来后点击intall安装,建议你先安装(simpli ...

  10. UI进阶 即时通讯之XMPP登录、注册

    1.XMPP环境搭建 http://www.cnblogs.com/fearlessyyp/p/5506644.html 第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功. 2.工程中添加X ...