文档章节

修复Maven项目默认文件夹的Maven Plugin开发

secondriver
 secondriver
发布于 2015/09/17 09:27
字数 1126
阅读 16
收藏 0

    总体说Maven Plugin开发算是比较简单,了解了Mojo之后,实现起Maven Plugin的一个个goal就更加轻松了。

    由于发现在通过eclipse或者archetype创建Maven工程之后,src下的目录时而不完整,于是打起开发一个Maven Plugin的主意。该插件命名为:hello-maven-plugin,此外Apache Maven官方声明过Maven Plugin命名需要注意的问题,Maven官方的Plugin命名格式为:maven-<plugin name>-plugin,其它个人或者组织可以使用<plugin name>-maven-plugin命名,当然不限于此。不过使用这种命名格式有个好处是在使用Plugin的时候可以通过 mvn plugin:goal 命令来进行操作,可以省去完整限定名。


   下面将是开发该插件的具体步骤:

  1. 创建hello-maven-plugin的Maven工程

  2. 在pom.xml中添加依赖和maven-plugin-plugin插件  

    

<dependencies>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-plugin-api</artifactId>
			<version>2.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven.plugin-tools</groupId>
			<artifactId>maven-plugin-annotations</artifactId>
			<version>3.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-core</artifactId>
			<version>3.1.0</version>
		</dependency>
	</dependencies>
<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-plugin-plugin</artifactId>
				<version>3.4</version>
				<executions>
					<execution>
						<id>default-descriptor</id>
						<phase>process-classes</phase>
					</execution>
				</executions>
			</plugin>

   需要注意的事,Mojo对象的通过Java doc Tag或者Java Annotation的注释的方式都可以通过处理生产plugin.xml的描述文件,这里使用Java Annotation。

   详情:http://maven.apache.org/plugin-tools/maven-plugin-annotations/index.html


3.编写Mojo

  通常一个Plugin中可能有多个goal,这里我们把多个Mojo的共同部分提取到父类,该父类是抽象类,并未实现execute方法,而是由每个实现特定goal的Mojo来实现。

  

package secondriver.maven.plugin.hello;

import org.apache.maven.plugin.AbstractMojo;

public abstract class BaseMojo extends AbstractMojo {

	public void printLine() {
		getLog().info(
				"------------------------------------------------------------------------");
	}
}


 

package secondriver.maven.plugin.hello;

import java.io.File;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
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.project.MavenProject;

@Mojo(name = "fixdir", requiresProject = true, threadSafe = true, defaultPhase = LifecyclePhase.NONE)
public class FixDir extends BaseMojo {

	@Parameter(defaultValue = "${project}")
	private MavenProject project;

	@Parameter(defaultValue = "${project.basedir}", readonly = true)
	private File baseDir;

	private String srcDir = "/src";

	private String mainJava = "/main/java";

	private String mainResources = "/main/resources";

	private String testJava = "/test/java";
	private String testResources = "/test/resources";

	@Parameter(name = "packageName", property = "fixdir.packageName", defaultValue = "${project.groupId}", required = true)
	private String packageName;

	public void execute() throws MojoExecutionException, MojoFailureException {
		String packagePath = packageName.replace(".", File.separator);

		// 创建关于main的目录
		mkdirs(mainJava + File.separator + packagePath);
		mkdirs(mainResources);

		// 创建关于test的目录
		mkdirs(testJava + File.separator + packagePath);
		mkdirs(testResources);
	}

	private void mkdirs(String path) throws MojoFailureException {
		File file = new File(baseDir, srcDir + File.separator + path);
		if (!file.exists()) {
			if (file.mkdirs()) {
				getLog().info(path + " created OK.");
			} else {
				getLog().error(path + " created Failed.");
				throw new MojoFailureException("Fix " + mainJava + ", "
						+ mainResources + ", " + testJava + ", "
						+ testResources + " Failed.");
			}
		}
	}
}


    上面的FixDirMojo实现了fixdir goal,其具体功能就是文中开始提到的将src的目录补完整(特别说一个,按照Maven工程的实际使用,这里并不完整,比如assembly,profile目录等都未创建)。

    限于篇幅有关Annotation的具体使用可以参见:http://maven.apache.org/plugin-tools/maven-plugin-tools-annotations/index.html#Supported_Annotations

    另外一个最好不过的方式就是通过Java Decompiler工具将现有个Maven Plugin反编译之后看看这些注解的具体使用。


4.编译,生成Plugin的描述文件,发布

  

hello-maven-plugin>mvn compiler:compile
hello-maven-plugin>mvn plugin:descriptor
hello-maven-plugin>mvn install

 也可以直接执行:mvn install


 通过plugin:descriptor将对Mojo进行处理,生成plugin.xml。关于描述下面是其中一部分摘取:

 

<plugin>
  <name>hello-maven-plugin Maven Mojo</name>
  <description></description>
  <groupId>secondriver.maven.plugin</groupId>
  <artifactId>hello-maven-plugin</artifactId>
  <version>1.0</version>
  <goalPrefix>hello</goalPrefix>
  <isolatedRealm>false</isolatedRealm>
  <inheritedByDefault>true</inheritedByDefault>
  <mojos>
    <mojo>
      <goal>fixdir</goal>
      <requiresDirectInvocation>false</requiresDirectInvocation>
      <requiresProject>true</requiresProject>
      <requiresReports>false</requiresReports>
      <aggregator>false</aggregator>
      <requiresOnline>false</requiresOnline>
      <inheritedByDefault>true</inheritedByDefault>
      <implementation>secondriver.maven.plugin.hello.FixDir</implementation>
      <language>java</language>
      <instantiationStrategy>per-lookup</instantiationStrategy>
      <executionStrategy>once-per-session</executionStrategy>
      <threadSafe>true</threadSafe>
      <parameters>
        <parameter>
          <name>baseDir</name>
          <type>java.io.File</type>
          <required>false</required>
          <editable>false</editable>
          <description></description>
        </parameter>
        <parameter>
          <name>packageName</name>
          <type>java.lang.String</type>
          <required>true</required>
          <editable>true</editable>
          <description></description>
        </parameter>
        <parameter>
          <name>project</name>
          <type>org.apache.maven.project.MavenProject</type>
          <required>false</required>
          <editable>true</editable>
          <description></description>
        </parameter>
      </parameters>
      <configuration>
        <baseDir implementation="java.io.File" default-value="${project.basedir}"/>
        <packageName implementation="java.lang.String" default-value="${project.groupId}">${fixdir.packageName}</packageName>
        <project implementation="org.apache.maven.project.MavenProject" default-value="${project}"/>
      </configuration>
    </mojo>
  </mojos>
</plugin>

 

 5.在Maven工程中添加hello-maven-plugin,并且使用其中功能

   

<plugin>
				<groupId>secondriver.maven.plugin</groupId>
				<artifactId>hello-maven-plugin</artifactId>
				<version>1.0</version>
			</plugin>

 

 执行 mvn hello:fixdir或者mvn secondriver.maven.plugin:hello:1.0:fixdir命令,修复src下的目录。


  执行前:

  wKiom1UScl_zaO_vAADhNIUJZy0122.jpg

  执行结果显示:

  wKiom1UScm_xHh1KAAIO46aC8dE834.jpg

  执行后:

  wKioL1USc7Czv0gXAAE01F7DGh0815.jpg


  通过对吧前后两幅目录树可以看出执行fixdir之后,test目录下结构完整了。


 6.写在最后

   本文只是通过创建一个简单的Maven Plugin解决实际中遇到的一个问题,其具备了功能性,但离一个合格的Maven Plugin的完整性还差好远。比如:Maven Plugin的参数说明,帮助文档,参数检查等。更多关于Maven Plugin开发还得去官网开开发文档(有点小凌乱),还有就是反编译已有的成熟Maven Plugin。

本文出自 “野马红尘” 博客,请务必保留此出处http://aiilive.blog.51cto.com/1925756/1624292

© 著作权归作者所有

secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
maven之打包插件(maven-assembly-plugin,maven-shade-plugin与maven-assembly-plugin)

一. 介绍 maven提供的打包插件有如下三种: 每种打包方式都具有自己的应用场景。 二. 打包准备 1). 需要设定文件的编码格式(如果不设定,将会以系统的默认编码进行处理)与JDK版本版本变量,...

mmss
2017/12/25
0
0
Could not calculate build plan

在eclipse下用maven新建web项目,新建过程中,报异常如下: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-war-plugin:2.2 or one of its dependencies could no......

liuhuics10
2015/12/22
736
0
用Maven快速生成带有依赖的可执行jar包

一、背景   最近项目在做微服务的拆分,那么我们想让我们的容器启动更加的轻量级,所以我们选择放弃tomcat等容器,而是通过maven生成带有指定依赖的可执行jar包的方式进行处理,本文我将分...

hafiz.zhang
2017/03/12
0
0
maven配置 两种方法修改jdk版

为了修改maven创建项目默认以来的jdk版本,看了下maven配置 maven2.0默认使用jdk1.5导致反省、@override 等annotation不可用。可用两种方法修改jdk版本 第一种:修改项目的pom.xml,影响单个...

vshcxl
2016/07/13
93
0
Maven实战读书笔记(10)

account-captcha的POM配置 <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......

祥林会跟你远走高飞
2014/12/17
206
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
5
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
17
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部