【Java工具开发】Maven插件开发之实战篇(二)

【Java工具开发】Maven插件开发之实战篇(二),第1张

【Java工具开发】Maven插件开发之实战篇(二)

作者:悠悠做神仙

来源: 恒生Light云社区

在学习了 【Java工具开发】Maven插件开发之基础篇(一) 后,想必大家对于Maven有了更加深刻的认识,这篇文章将教手把手教大家开发一款Maven插件。

文章目录:

1、创建一个插件项目

2、引入插件开发相关依赖

3、继承插件父类,设置目标

4、绑定到构建生命周期

5、默认可获取的参数

6、参数配置和使用

7、编写核心代码

8、编译打包,安装使用

首先说一下插件开发准备:

(1)安装好Maven,并配置好环境变量以及setting.xml文件。

(2)安装好JDK,并配置好环境变量。

(2)现成的开发工具:idea或eclipse。(本文采用2021.1版Idea)

(3)插件的命名要求了解:自己开发的插件,命名采用 -maven-plugin ,而不要采用 maven--plugin ,因为 它是 Apache Maven 团队维护的官方 Apache Maven 插件的保留命名模式 ,带有 groupId 。使用这种命名模式是对 Apache Maven 商标的侵犯。

在做好相关准备工作之后,我们进入正题:guzhang:~

1、创建一个插件项目

新建一个maven项目。

填写关于项目一些信息。(项目命名最好能体现其功能,比如scan-maven-plugin,就是扫描的插件,我这里仅仅是演示,就先用缩写了)

创建好项目后,进入到项目界面,这时候开始配置maven地址,根据个人之前安装的地址进行选择。

创建包和类。

在pom.xml文件中,更改默认的打包方式。这也就是插件项目不同于一般项目的地方。

maven-plugin

至此,第一步完成!

2、引入插件开发相关依赖

插件项目开发,有两个最重要的依赖,(当然也有说三个的,后面说第三个),一个是maven插件的api,一个是目标注解的来源。

 
        
        
            org.apache.maven
            maven-plugin-api
            3.6.2
        
        
        
            org.apache.maven.plugin-tools
            maven-plugin-annotations
            3.6.0
            provided
        

    

第三个依赖,有些项目也会用到,今天的演示项目主要是用前两个。

        
            org.apache.maven
            maven-core
            3.6.2
        

3、继承插件父类,设置目标

org.apache.maven.plugin.AbstractMojo 除了 execute 方法之外,该类提供了实现 mojo 所需的大部分基础结构。

注释“ @Mojo ”是必需的,它控制着 mojo 的执行方式和时间。

该 execute 方法可以抛出两个异常:

org.apache.maven.plugin.MojoExecutionException 如果出现意外问题。抛出此异常会导致显示“BUILD ERROR”消息。 org.apache.maven.plugin.MojoFailureException 如果出现预期问题(例如编译失败)。抛出此异常会导致显示“BUILD FAILURE”消息。

该 getLog 方法(在 中定义 AbstractMojo )返回一个类似 log4j 的记录器对象,它允许插件在“调试”、“信息”、“警告”和“错误”级别创建消息。该记录器是向用户显示信息的公认方式。请查看 检索 Mojo Logger 部分以获取有关其正确用法的提示。

这里的 @Mojo 的 name ,就是目标的设置,当然你也可以在注释里面 @goal showProjectInfo 的形式,或者在pom文件中指定,效果是一致的。

对于更多的Mojo 注释,可以参考 Mojo API 规范 。

4、绑定到构建生命周期

根据插件不同的功能,我们可以绑定在相对应的生命周期来触发,比如有些是关于测试的插件,就可以绑定到测试阶段等等。这里演示,绑定到编译阶段。

生命周期的绑定方法也有三种,第一种,就是在 @Mojo 注解上,增加一个 defaultPhase ,并赋值。(如图,可以看到 LifecyclePhase 下的阶段)

方法二,和之前说的goal一样,采用注释的方式。

方法三,是在pom文件中指定。

注:一个插件可以设置多个目标,每个目标都可以绑定到不同的阶段。

5、默认可获取的参数

Maven提供三个隐式变量,用来访问系统环境变量、POM信息和maven的setting, 属于Maven预定义,用户可以直接使用。

${basedir} 表示项目根目录,即包含pom.xml文件的目录;
${version} 表示项目版本;
${maven.build.timestamp} 表示项目构件开始时间;
${maven.build.timestamp.format} 表示属性maven.build.timestamp.format表示属性{maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参java.text.SimpleDateFormat。

用法如下: 

  yyyy-MM-dd HH:mm:ss


使用pom属性可以引用到pom.xml文件对应元素的值

${project.basedir} 同${basedir};
${project.baseUri} 表示项目文件地址;
${project.build.directory} 表示主源码路径;
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes;
${project.build.sourceEncoding} 表示主源码的编码格式;
${project.build.sourceDirectory} 表示主源码路径;
${project.packaging} 打包类型,缺省为jar;
${project.version} 表示项目版本,与project.version表示项目版本,与{version}相同。
其他的参数,可以根据pom文件具体的配置,通过${project.xxx}获取任意节点的内容。

6、参数配置和使用

Maven插件的开发,其中注释就是maven插件重要的元数据。


对于 parameter 参数,可以参考 Parameter 类:

@Parameter类
public @interface Parameter {
	//别名
    String alias() default "";
	//属性,通过命令行可配置
    String property() default "";
	//默认值
    String defaultValue() default "";
	//是否必须,默认false
    boolean required() default false;
	//是否只读,默认false
    boolean readonly() default false;
}

Maven插件的参数,可以通过设置默认值,通过命令行配置,以及可以在pom文件中配置。

支持的格式,也是很丰富。(以下XML是指pom.xml文件)

布尔值:包括 boolean 和 Boolean ,读取的时候, “true” 会设置成 true ,其他文本则是 false 。

项目中配置:  

@Parameter
private boolean myBoolean;

pom中配置:
 
       true
 

整数: byte , Byte , int , Integer , long , Long , short ,和 Short 。读取配置时,XML 文件中的文本将使用 Integer.parseInt() 或 valueOf() 适当类的方法转换为整数值。 浮点类型: double , Double , float ,和 Float 。读取配置时,XML 文件中的文本将使用 valueOf() 相应类的方法转换为二进制形式。 日期:这包括输入的变量 Date 。读取配置时,XML 文件中的文本将使用以下日期格式之一进行转换:“ yyyy-MM-dd HH:mm:ss.S a ”(示例日期为“2005-10-06 2:22:55.1 PM”)或“ yyyy-MM-dd HH:mm:ssa ”(示例日期为“2005-10-06 2:22:55PM”)。解析是使用 DateFormat.parse() 完成的。 文件和目录:包括输入的变量 File 。读取配置时,XML 文件中的文本用作所需文件或目录的路径。如果路径是相对的(不以 / 或类似的驱动器号开头 C: ),则该路径相对于包含 POM 的目录。 网址:包括输入的变量 URL 。读取配置时,使用 XML 文件中的文本作为 URL。格式必须遵循 RFC 2396 准则,并且看起来像任何 Web 浏览器 URL ( scheme://host:port/path/to/file )。 纯文本: char , Character , StringBuffer ,和 String 。 枚举:首先你需要定义你的枚举类型,然后你可以在参数定义中使用枚举类型。 例如:

public enum FileStyle {
      XML,
      CLASS,
      JAVA
    }

    
    @Parameter
    private FileStyle myFileStyle;

在pom中使用:
 
       JAVA
 

数组:数组类型参数是通过多次指定参数来配置的。

    @Parameter
    private String[] myArray;

在pom文件中配置:
 
       
          value1
          value2
        
 

集合:此类别涵盖任何实现 java.util.Collection 诸如 ArrayList 或 的类 HashSet 。这些参数是通过多次指定参数来配置的,就像数组一样。

  
    @Parameter
    private List myList;

在pom文件中配置:
 
       
          value1
          value2
       
 

map集合:此类别包括它实现的任何类 java.util.Map ,如 HashMap 但 不 执行 java.util.Properties 。这些参数是通过  value  在参数配置的表单中包含 XML 标签来配置的。

    
    @Parameter
    private Map myMap;

在pom文件中配置:
 
        
          value1
          value2
        
 

还要一些不常用的类型,也可以参考 官网 。

7、编写核心代码

我们这里主要是做一个项目信息的打印显示,具体是读取默认参数、pom文件等,进行一个展示。

package com.hundsun.broker;

import org.apache.commons.lang3.StringUtils;
import org.apache.maven.plugin.AbstractMojo;
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 java.io.File;
import java.util.List;


@Mojo(name = "showProjectInfo", defaultPhase = LifecyclePhase.COMPILE)
public class MyMojo extends AbstractMojo {
    
    @Parameter(defaultValue = "${basedir}", readonly = true, required = true)
    private File basedir;

    
    @Parameter(property = "version", defaultValue = "${project.version}", readonly = true, required = true)
    private String version;

    
    @Parameter(defaultValue = "${settings.localRepository}", readonly = true, required = true)
    private String localRepository;

    
    @Parameter(property = "author", defaultValue = "${showProjectInfo.author}", readonly = true, required = true)
    private String author;

    
    @Parameter(property = "lists", readonly = true)
    private List lists;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("*******************ShowProjectInfo*******************");
        getLog().info("--------------------MyFirstMojo,begin--------------------");
        System.out.println("欢迎语:Hello Maven Plugin");
        System.out.println("项目本地仓库localRepository:" + this.localRepository);
        System.out.println("项目跟路径basedir:" + basedir);
        System.out.println("项目版本version:" + this.version);
        System.out.println("项目作者author:" + author);
        System.out.println("项目包含文件类型lists:" + StringUtils.join(lists.toArray(), ","));
        getLog().info("--------------------MyFirstMojo,end-----------------------");
    }
}

8、编译打包,安装使用

调用maven命令,编译打包,主要是 mvn install 或 mvn clean install 。

本项目,先注释掉关于参数配置这一块,然后 mvn install 或 mvn clean install 。

这个时候插件已经安装到本地库,我们的项目,只要在pom中在引用上面这一块,那么就会输出信息了。(这里我还是用这个项目,没换其他项目)

然后重新编译打包一下。 mvn clean install

因为我们绑定在编译阶段,所以这个时候已经可以看到一些项目信息了。

这个时候我们可以调用一下,命令:

mvn com.hundsun:yyzsx-maven-plugin:1.0-SNAPSHOT:showProjectInfo

格式是这样的: mvn groupId:artifactId:version:goal

调用命令感觉太长了?如果你命名符合标准,而且只采用一个默认版本的,那么可以缩写:

原来的是: mvn com.hundsun:yyzsx-maven-plugin:1.0-SNAPSHOT:showProjectInfo

缩写后: mvn yyzsx:showProjectInfo ,即: mvn ${prefix}:goal

效果是一样的。


看到这里,相信大家也开发出了自己的第一款Maven插件!其实插件,只是一种形式,在了解了一些参数配置后,后面写核心代码其实和正常工程是一个样的逻辑。

具体还想了解更多?来,这里给个官网地址: 插件开发者中心

最后,感谢阅读,喜欢的一键三连呗(点赞、收藏、评论/转发)~

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5709552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存