百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

不会开发Maven插件(plugin)?我来帮你梳理内容

toyiye 2024-08-26 22:38 5 浏览 0 评论

前言

Maven是现在最流行的项目管理工具,同时Maven的插件也给我们提供了非常多的便利,本次我就给大家将一下Maven是如何进行自定义插件开发的。

为了方便用户编写 Maven 插件的方向和过程有个总体的了解,先介绍一下编写Maven插件的基本步骤。

  1. 创建 Maven 项目。插件的功能肯定需要编写Java类的,所以插件本身就是一个Maven项目。当然,相对于以前研究的Maven项目,插件项目有它的特殊点:packaging必须是maven-plugin类型,可以通过maven-archetype-plugin快速创建一个Maven插件项目。
  2. 编写插件目标。每个插件都至少包含一个目标,每个目标对应一个独立的Java类。这里把这种类叫Mojo类(对象)。Mojo类必须继承AbstractMojo父类。
  3. 设置目标的配置点。大部分Maven插件和它的目标都是可以配置的。根据需要,可以在编写Mojo的时候给它设置好可以配置的参数。
  4. 编写逻辑代码,实现目标功能。用Java代码实现插件的功能。
  5. 处理错误和日志。当Mojo运行的时候发生异常时,需要根据情况控制Maven的运行状况,并且用代码实现必要的日志输出,为用户提供必要的提示信息。
  6. 测试插件。编写测试案例,绑定(或命令行)执行插件。

创建Maven项目

如下所示,我们选择maven项目(其实只要是Maven项目都是可以的),最重要的是要把<packaging>标签对应的参数设置为maven-plugin快速创建一个Maven插件项目。

编写插件目标

如下所示,我们继承了AbstractMojo抽象类并且使用@Mojo注解声明了插件目标为demo-print,这个参数是必填的,不然你执行插件的时候不就没有执行目标名称了么。

@Mojo(name = "demo-print")
public class ListModuleMojo extends AbstractMojo {
    /**
     * 读取项目及其子项目的版本号
     */
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
    }
}

这里重点说一下我们经常会用到的几个注解:

  • @Mojo:标记该类为Mojo类,常见参数说明:

name:声明该Mojo的目标名称

defaultPhase:声明默认将该目标绑定到Maven生命周期的某个阶段,默认是LifecyclePhase.NONE

requiresDependencyResolution:声明运行该Mojo之前必须解析哪些范围的依赖,默认是ResolutionScope.NONE

requiresDependencyCollection:所需的依赖项集合范围,默认是ResolutionScope.NONE

instantiationStrategy:Mojo实例化策略,默认是InstantiationStrategy.PER_LOOKUP

executionStrategy:执行策略,默认是once-per-session

requiresProject:声明该目标是不是必须在一个Maven项目中运行,默认值是true

aggregator:在多模块的Maven项目中,声明该目标是否只在顶层模块构建的时候执行,默认false(也就是默认会执行父子模块)

requiresDirectInvocation:是否只能通过命令行的调用,默认为false

threadSafe:是否线程安全,默认是false(只是说明而已,线程安全还是需要自己保证)

  • @Parameter:将Mojo中的某个参数标记为可配置参数,常见参数说明:

name:参数名字

alias:别名设置

property:用于检索值的属性,可以通过-D或者pom文件中配置

defaultValue:默认值

required:是否必须

readonly:是否只读,默认为false,如果设置为true,那不能通过外界用户对该属性进行配置

  • @Component:组件注入

编写代码逻辑

下面展示一个Demo。这个Demo很简单,就是打印项目的根路径。这里我们可以看到Maven插件的日志打印方式是通过getLog()方式进行日志打印。同时MojoExecutionException(打断这个Maven执行流程的严重错误)和MojoFailureException(这个错误可能不至于严重到破坏整个执行流程)分别是两个异常处理类,具体的区别参考:https://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-custom-plugin.html

@Mojo(name = "demo-print")
public class ListModuleMojo extends AbstractMojo {
   
    @Parameter(defaultValue = "${project}", required = true, readonly = true )
    protected MavenProject project;
    
    /**
     * 读取项目及其子项目的版本号
     */
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        if(Objects.isNull(project)) {
            throw new MojoExecutionException("project对象不能为空");
        }
        getLog().info("本地项目根路径: " + project.getBasedir());
    }
}

我们如何调试Maven插件呢?

首先插件项目我们需要进行Debug配置,配置方式如下所示。

然后在项目中引用对应的插件,然后通过mvnDebug命令对插件进行调试即可。

常用的maven插件

在日常开发中我们可能会用到的几个插件:

版本修改插件(versions-maven-plugin)、snapshot&release流程控制插件(maven-release-plugin)、规则校验插件(maven-enforcer-plugin)、依赖打印处理插件(maven-dependency-plugin)、脚手架生成插件(maven-archetype-plugin)、各种打包/编译插件(maven-compiler-plugin、maven-resources-plugin、spring-boot-maven-plugin、maven-assembly-plugin、maven-war-plugin、maven-jar-plugin)、maven-help-plugin等。

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码