自己动手编写Maven的插件
Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。本文参考官方文档后使用archetype创建,手动创建太麻烦。
- 创建创建项目
选择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> - 实现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;这里是单独的;
- 更多标注信息请参考官方文档;
- 部署&执行
部署插件到本地仓库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
- 使用简单命令执行
如果你的artifacitId符合格式 ${prefix}-maven-plugin 或 maven-${prefix}-plugin,可以在你的settings.xml配置文件中加上<pluginGroups>
<pluginGroup>net.oseye</pluginGroup>
</pluginGroups>现在可以这样执行
mvn MvnPluginDemo:oseye
而我的Demo没有按照上述格式配置,更多格式信息请参考官方。
- @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。
- @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阶段。
- 参数
插件可以接受从配置文件注入的数据,这里还是使用标注,格式是:@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的插件的更多相关文章
- 自己动手编写一个VS插件(五)
作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...
- 自己动手编写一个VS插件(七)
作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...
- 自己动手编写一个Mybatis插件:Mybatis脱敏插件
1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...
- 自己动手编写一个VS插件(八)
作者:朱金灿 来源:http://blog.csdn.net/clever101 利用业余时间继续开发一个VS插件.我要开发的插件是一个代码库插件,主要是用于积累我平时要使用的代码.在之前我已经实现了 ...
- 自己动手编写一个VS插件(六)
作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇中我们已经实现了创建和显示一个工具栏出来,它的效果图是这样的: 现在我们实现一些简单功能,具体就是单击按钮弹出一 ...
- 自己动手编写vue插件
一.为什么要自己动手写插件呢,原因有二: 其一:是因为最近产品了提了一个在web端接收,消息通知的需求,产品要求在若干个页面内如果有消息,就要弹出消息弹窗展示给用户,略加思索之后,第一反应就是写个消息 ...
- 动手编写插件-javascript分页插件
原来公司用的报表分页插件是C#编写的服务器插件,需要前后台交互,而且不支持ajax. 经过一段时间折腾,我编写了一个轻便的jquery分页插件,支持ajax.下面是插件代码 /* 插件名称:报表分页 ...
- IDEA集成有道翻译插件/maven帮助插件/mybatis插件
(一)IDEA集成有道翻译插件:https://www.cnblogs.com/a8457013/p/7814335.html 插件下载地址:http://plugins.jetbrains.com/ ...
- OWIN系列之自己动手编写中间件
一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. 2.OWIN.dll介绍 使用反编 ...
随机推荐
- Angular - - ngCloak、ngController、ngInit、ngModel
ngCloak ngCloak指令是为了防止Angular应用在启动加载的时候html模板将会被短暂性的展示.这个指令可以用来避免由HTML模板显示造成不良的闪烁效果. 格式: ng-cloak ...
- Repeated Substring Pattern Leetcode
Given a non-empty string check if it can be constructed by taking a substring of it and appending mu ...
- java me 旋转的X案例
package com.xushouwei.cn; import javax.microedition.lcdui.Command;import javax.microedition.lcdui.Co ...
- jQuery软键盘插件
1.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.or ...
- Pomelo的component组件
pomelo的核心是由一系列松耦合的component组成,同时我们也可以实现我们自己的component来完成一些自己定制的功能.对于我们的聊天应用,我们尝试给其增加一个component,目的是展 ...
- WebSocket协议再认识
WebSocket出现之前 在线聊天室.在线客服系统.评论系统.WebIM等这些应用有一个共同点,就是用户不需要去刷新浏览器就能够从服务器获得最新的数据,这就用到了推送技术. WebSocket出现之 ...
- 有效的GOCsharpHelper1.0(源代码开放)
csharp编写界面,调用基于opencv的图像处理类库,是解决一类问题的优良方法.经过不懈研究,有最新进展: 一.目前情况和优点 位置在11.通过clr 架在c ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...
- 如何在Crystal框架项目中内置启动Zookeeper服务?
当Crystal框架项目需要使用到Zookeeper服务时(如使用Dubbo RPC时,需要注册服务到Zookeeper),而独立部署和启动Zookeeper服务不仅繁琐,也容易出现错误. 在小型项目 ...
- Condition源码分析
转:http://www.nbtarena.com/Html/soft/201308/2429.html Condition的概念 大体实现流程 I.初始化状态 II.await()*作 III.si ...