文档章节

Maven Plugin示例:自己动手编写Maven插件

独钓渔
 独钓渔
发布于 2017/08/31 16:21
字数 1084
阅读 120
收藏 0
点赞 0
评论 0

重要声明:插件命名规范和Apache Maven商标

通常将你的插件命名为<yourplugin>-maven-plugin。
强烈反对命名为maven-<yourplugin>-plugin(maven在插件名开头),因为这是Apache Maven组织为官方Maven插件保留的命名格式,用org.apache.maven.plugins作为组id。使用此命名是对Apache Maven商标的侵权。

一: 知识要点

Maven为我们提供了丰富的插件资源,使得开发调试过程中非常方便,可以满足大多数场景下的需求。当然有时候,我们也需要根据需求定制自己的插件。下面是在开发Maven插件时的一点备忘录,具体的开发流程请Google,有不少的教程,这里只是概述一下,同时记录一些容易掉坑的点。

1,Maven的工具由一个又一个的插件组成的,插件类继承了AbstractMojo类,需要覆写execute方法。getLog()获取的是AbstractMojo内部的log,类型是:org.apache.maven.plugin.logging.Log; 在Mojo的开发中,不要使用其他的Log基础设施。注: Mojo = Maven Old Java Object;

2,pom.xml文件中,打包(packaging)类型应该为 maven-plugin,而不是war/jar。同时需要依赖的两个核心依赖是:

maven-plugin-api:这是插件开发的api;
maven-plugin-annotations:这是进行插件注解的api。

3,开发Maven插件和开发普通的Maven工程的流程是一样的,不同在于插件的 archetype应该设置为:maven-archetype-plugin;

4,插件的入口类为继承了AbstractMojo的实现类,但是需要进行注解。注解@Mojo是必须要的,这是定义插件对象的启动方法,由于该类只有一个方法,所以启动方法和启动类是一致的。在Maven 3之前是使用注释注解:@goal doSomething这种方式。现在已经不使用这种方式了。举个例子,如果进行如下标注:

@Mojo( name = "doSomething")
public class GreetingMojo extends AbstractMojo{
...
}
mvn groupId:artifactId:version:doSomething  //如果一个项目中只version时,则version可以省略,只有一个@Mojo标记,估计后面的Mojo名称估计可以省略。

5,除了标注执行的方法,还可对成员变量进行标注,以便自动获取或由用户传入参数。

	<build>
		<plugins>
			<plugin>
				<groupId>com.imddy.plugin</groupId>
				<artifactId>ddyhello-maven-plugin</artifactId>
				<version>0.0.1-SNAPSHOT</version>
				<configuration>
                    <port>8090</port>
                </configuration>
			</plugin>
		</plugins>


	</build>

6,每个Mojo(由@Mojo标注)都有生命周期,即该Mojo的执行时间。用户可以选择将某个插件目标绑定到生命周期的某个阶段,从而让构建过程更为完善。生命周期的具体介绍参考文末给出的文章。下面将插件配置到编译阶段执行:

<build>
    <plugins>
      <plugin>
        <groupId>sample.plugin</groupId>
        <artifactId>doSomething-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>doSomething</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

 

 

 

 

二: 实行过程

新建 maven-archetype-plugin的maven项目

选择好项目的ArifactId, xxxx-maven-plugin

项目会知道安装maven-tools工具

会自动生成

package com.imddy.plugin.ddyhello_maven_plugin;



import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Goal which touches a timestamp file.
 *
 * @deprecated Don't use!
 */
@Mojo(name = "touch", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {
	/**
	 * Location of the file.
	 */
	@Parameter(defaultValue = "${project.build.directory}", property = "outputDir", required = true)
	private File outputDirectory;

	public void execute() throws MojoExecutionException {
		File f = outputDirectory;

		if (!f.exists()) {
			f.mkdirs();
		}

		File touch = new File(f, "touch.txt");

		FileWriter w = null;
		try {
			w = new FileWriter(touch);

			w.write("touch.txt");
		} catch (IOException e) {
			throw new MojoExecutionException("Error creating file " + touch, e);
		} finally {
			if (w != null) {
				try {
					w.close();
				} catch (IOException e) {
					// ignore
				}
			}
		}
	}
}

上面这个是自动生成的一个代码,使用了Mojo注解为touch

当我们使用

com.imddy.plugin:ddyhello-maven-plugin:touch

这是在另一个项目的测试结果为

 

除了默认的,我可以自己手动写的代码如下:

package com.imddy.plugin.ddyhello;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Mojo(name = "drive")
public class Car extends AbstractMojo {

    @Parameter(defaultValue = "8080")
    private Integer port;
    
    public void execute() throws MojoExecutionException, MojoFailureException {
    	getLog().info( "Hello, world." );
        System.out.println("Car drive...");
        System.out.println(port);
    }

}

1 getLog().info()这个是日志输出,写maven最好不要使用其它的日志。

2 @Parameter(defaultValue = "8080")
    private Integer port;

Paramter可以用来设置参数这个参数也可以在pom.xml中配置

	<build>
		<plugins>
			<plugin>
				<groupId>com.imddy.plugin</groupId>
				<artifactId>ddyhello-maven-plugin</artifactId>
				<version>0.0.1-SNAPSHOT</version>
				<configuration>
                    <port>8090</port>
                </configuration>
			</plugin>
		</plugins>


	</build>

不配置会输出默认值。

使用命令如下:

com.imddy.plugin:ddyhello-maven.plugin:driver

如果插件需要绑定在某个阶段

<build>
		<plugins>
			<plugin>
				<groupId>com.imddy.plugin</groupId>
				<artifactId>ddyhello-maven-plugin</artifactId>
				<version>0.0.1-SNAPSHOT</version>
				<configuration>
                    <port>8090</port>
                </configuration>
                <executions>
                    <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>doSomething</goal>
                    </goals>
                    </execution>
                </executions>
			</plugin>
		</plugins>


</build>

 

 

© 著作权归作者所有

共有 人打赏支持
独钓渔
粉丝 47
博文 373
码字总数 142587
作品 0
沙坪坝
系统管理员
黄勇/smart-framework

Smart Framework 简介 1. 它是一款轻量级 Java Web 框架 内置 IOC、AOP、ORM、DAO、MVC 等特性 基于 Servlet 3.0 规范 使用 Java 注解取代 XML 配置 2. 它使应用充分做到“前后端分离” 客户...

黄勇 ⋅ 2013/09/23 ⋅ 0

常用Maven 插件总结

一. 打包类 1. Shade Plugin 用来打可执行的Jar包 示例: <build> <finalName>storm-start-${project.version}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupI......

marvin_vov ⋅ 2015/10/20 ⋅ 0

常用Maven插件介绍(上)

转自 : http://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源...

long0404 ⋅ 2016/06/16 ⋅ 0

如何编写一个Maven插件

如何编写一个Maven插件 本文基于eclipse ee. 建立一个maven插件工程: 主要就是让项目能依赖maven-plugin-api: 编写一个Mojo类: /** 用于输出消息的Mojo @goal hello /public class HelloMoj...

ihaolin ⋅ 2014/07/12 ⋅ 0

Maven实战(七)——常用Maven插件介绍(上)

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一...

有事没事 ⋅ 2016/09/21 ⋅ 0

Maven常用插件(转)

Maven常用插件(转) 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步...

Lubby ⋅ 2016/07/12 ⋅ 2

maven plugin的execution出错

Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-dependency-plugin:2.7:copy... 错误如上,有介绍解决方法org.eclipse.m2elifecycle-mapping1.0......

疯狂的兔子 ⋅ 2014/03/18 ⋅ 0

maven生命周期与插件

生命周期 在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段package. 生命周期概念 Maven的生命周期就是为了对所有的构建过程进行抽象和...

cloud-coder ⋅ 2013/11/26 ⋅ 0

Maven实战读书笔记(18)

编写Maven插件的一般步骤 1、创建一个maven-plugin项目:插件本身也是Maven项目,特殊的地方在于它的packaging必须是maven-plugin,用户可以使用maven-archetype-plugin快速创建一个Maven插件...

祥林会跟你远走高飞 ⋅ 2014/12/25 ⋅ 0

快速构建docker镜像:maven插件

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个d...

rabbitGYK ⋅ 04/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 1分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 6分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 18分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 38分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 54分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部