自定义maven插件

maven插件简介

       一般的maven插件使用时需要引入插件的gav(groupId,artifactId,version)就可以正常使用了。一般的结构如下:

 包含插件的gav,还有一组可执行器<execution>。在每个<execution>里面包含有如下结构

一个可执行器的结构如上,其中各标签释义如下:

<configuration>表示该可执行器的配置项,后续在自定义实现maven插件中会详细的描述

<id>就是取个名字,别重复就行了

<phase>表示该可执行器在maven的生命周期的哪个阶段生效,如果不配置,使用插件默认的,maven的生命周期如下:

<goals>一组目标,每个<goal>表示一个对应的插件实现类(每个插件实现类都会关联自己的goal)。

当完成如上配置时,mavne在执行到相应的生命周期时,就会调用对应的goal实现类的相关方法完成业务逻辑处理

自定义实现

           新建一个maven工程如下:

        1  修改package

如上图,修改该maven工程的<packaging>标签为:

                      

<packaging>maven-plugin</packaging>

        2 引入依赖

需要引入maven插件的相关依赖:

 <dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>3.5.2</version>
</dependency>

        3  编写代码

创建类继承org.apache.maven.plugin.AbstractMojo实现相关业务逻辑

public class PrintLogMojo extends AbstractMojo {
    
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        Log log = getLog();
        log.info("测试执行自定义插件goal是comment!");
    }
}

在上面讲解maven的结构时有提到关于goal的绑定。goal绑定有2中方式:注释和注解

注释方式:

使用注释的方式绑定goal有的时候会存在问题:比如在类上再添加其他的xxxx的注释时,有可能会把类的注释也绑定上去了,该种方式不推荐

注解方式:

使用注解的方式绑定goal还需要引入一个依赖:

<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-annotations</artifactId>
    <version>3.5.2</version>
</dependency>

推荐使用该种方式绑定goal

在maven插件逻辑编写时也可以绑定该<execution>执行器的执行参数,如下所示:

import org.apache.commons.io.FileUtils;
import org.apache.maven.model.Build;
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 org.apache.maven.project.MavenProject;

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

/**
 * 移动jar包到指定目录
 */
@Mojo(name = "move",defaultPhase = LifecyclePhase.PACKAGE)
public class MoveMojo extends AbstractMojo {

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

    @Parameter(required = true)
    private String toAbsolutePath;

    @Parameter(required = false)
    private int age;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        String packaging = mavenProject.getPackaging();
        Build build = mavenProject.getBuild();
        String finalName = build.getFinalName();

        // 最终打包的绝对路径也就是target文件夹目录
        String directory = build.getDirectory();

        String targetAbsolutePath = directory + File.separator + finalName + "." + packaging;

        try {
            FileUtils.copyFileToDirectory(new File(targetAbsolutePath),new File(toAbsolutePath));
        } catch (IOException e) {
            throw new RuntimeException("拷贝文件异常" + e.getMessage());
        }

    }
}

其中对象MavenProject表示整个maven工程对象的封装,可以从中拿到整个maven工程相关的配置项。其余的配置项是自定义的配置项,在每个<execution>标签均会绑定自己的<configuration>配置项。其中@Parameter注解的required属性表示该配置是否是必须的,如果是true,在使用该插件的该goal时就必须配置,具体使用如下:

        4 打包安装

使用maven的install命令安装该插件到本地(或者公司私服或者公服)上,就可以被其他人使用了

        5 引用实践

安装上述步骤将maven插件打包安装之后,就可以在其他的项目中使用该插件完成相关功能,配置demo如下:

当执行maven项目的package时,就可以在控制台看到自定义插件的日志打印和其他的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统设计架构——互联网案例

Netflix 的技术栈 移动和网络:Netflix 采用 Swift 和 Kotlin 来构建原生移动应用。对于其 Web 应用程序,它使用 React。 前端/服务器通信:Netflix 使用 GraphQL。 后端服务:Netflix 依赖 ZUUL、Eureka、Spring Boot 框架和其他技术。 数据库:Netflix 使用 EV 缓存、Cas…

【线性代数】两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗?

一、问题 两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗? 二、答案 不一定,当两个向量组中的向量个数也相同时,结论才成立.若向量个数不相同,结论不成立. 例如&#xff1a; 向量组一&#xff1a;(1,0),(0,1) 向量组二&#xff1a;(1,0),(0,1),(1,1) 两…

超结MOS/低压MOS在5G基站电源上的应用-REASUNOS瑞森半导体

一、前言 5G基站是5G网络的核心设备&#xff0c;实现有线通信网络与无线终端之间的无线信号传输&#xff0c;5G基站主要分为宏基站和小基站。5G基站由于通信设备功耗大&#xff0c;采用由电源插座、交直流配电、防雷器、整流模块和监控模块组成的电气柜。所以顾名思义&#xf…

HarmonyOS应用开发实战—开箱即用的活动创建页面【ArkTS】【鸿蒙专栏-33】

一.HarmonyOS应用开发实战—开箱即用的个人主页页面【ArkTS】【鸿蒙专栏-32】 1.1 项目背景 HarmonyOS(鸿蒙操作系统)是华为公司推出的一种分布式操作系统。它被设计为一种全场景、全连接的操作系统,旨在实现在各种设备之间的无缝协同和共享,包括智能手机、平板电脑、智能…

安防监控EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?

国标GB28181视频监控系统EasyCVR平台采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0…

【Transformer框架代码实现】

Transformer Transformer框架注意力机制框架导入必要的库Input Embedding / Out EmbeddingPositional EmbeddingTransformer EmbeddingScaleDotProductAttention(self-attention)MultiHeadAttention 多头注意力机制EncoderLayer 编码层Encoder多层编码块&#xff0f;前馈网络层…

mvn 指令报错 环境变量没问题----- jdk版本问题

有一个文件夹&#xff0c;里面mvn指令不能使用。mvn -version都会报错&#xff1a; 使用绝对地址也无法&#xff0c;设置权限也无法&#xff0c;到其上一层文件就可以正常使用。 于是我另外创建了个文件夹&#xff0c;把这个文件夹的所有东西全部复制进去&#xff0c;然后一个…

SpringBoot前后端分离开发项目部署时,项目打包准备工作

第一步&#xff1a;项目打包之前&#xff0c;拉前后端代码 拉完代码后&#xff0c;再执行下面操作&#xff08;确保项目能正常启动并运行&#xff09; 后端&#xff08;执行如下操作&#xff09; mvn clean install -T 8 -Dmaven.test.skiptrue -Dmaven.compile.forktrue 执行…

外汇天眼:在交易中有多少属于你的行情?

期货、股票、外汇不同的市场有着不同的特性&#xff0c;就一个市场而言&#xff0c;也不会是每一段行情都适合你。 新手完全是靠冲动和情绪交易 刚刚进入期货、股票、外汇市场的朋友都会被其巨大的财富效应所震慑&#xff1a;还有这样赚钱的&#xff1f; 而且机会比比皆是&am…

多个描述文件对开发者证书有影响吗

在开发iOS应用程序时&#xff0c;开发者证书是用于签名应用程序的关键工具。这一步骤保证了应用程序的合法性和安全性&#xff0c;避免了恶意篡改和未经授权的访问。那如果有多个描述文件会对开发者证书有影响吗。下面我简单的讲解一下他们之间的关系跟有什么影响。 首先&…

【STM32入门】4.2对射红外传感器计次

1.接线方式 主要是编写传感器的驱动、配合OLED&#xff0c;每遮挡对射红外传感器&#xff0c;OLED屏幕的计数就加一。 2.驱动编写 首先新建.c文件和.h文件&#xff0c;命名为CountSensor 国际惯例&#xff0c;.c文件内要包含stm32.h头文件&#xff0c;然后编写 CountSensor_…

3ds Max渲染贴图丢失?这样操作就能搞定!

当你在使用3ds Max进行渲染时&#xff0c;有时候会遇到贴图丢失的问题&#xff0c;导致模型无法正常显示。这可能是因为你在导入模型或添加贴图时出现了一些错误。不过不用担心&#xff0c;接下来我将向你解释这个问题可能出现的几种原因&#xff0c;同时提供有效的解决方案。 …

【力扣100】226.翻转二叉树

添加链接描述 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def invertTree(self, root: Optional[TreeN…

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算…

CSharp中Blazor初体验

Blazor 是一个由微软开发的开源 Web 框架&#xff0c;用于构建富客户端 Web 应用程序使用 C# 语言和 .NET 平台。Blazor 允许开发人员使用 C# 语言来编写前端 Web 应用程序&#xff0c;而不需要像传统的 JavaScript 框架&#xff08;如 Angular、React 或 Vue.js&#xff09;那…

代码随想录算法训练营第二十一天 | 二叉树众数、公共祖先

目录 力扣题目 力扣题目记录 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 普通二叉树 搜索二叉树 236. 二叉树的最近公共祖先 总结 总结 力扣题目 用时&#xff1a;2h 1、530.二叉搜索树的最小绝对差 2、501.二叉搜索树中的众数 3、236. 二叉树的最近公共…

02 ModBus TCP

目录 一、ModBus TCP 一帧数据格式 二、0x01 读线圈状态 三、0x03读保持寄存器 四、0x05写单个线圈 五、0x06 写单个寄存器 六、0x0f写多个线圈 七、0x10&#xff1a;写多个保持寄存器 八、通信过程 九、不同modbus通信模式的应用场景 一、ModBus TCP 一帧数据格式 其…

队列(C语言版)

一.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有 先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为…

【大数据面试】Flink面试题附答案

目录 ✅Flink介绍、特点、应用场景 ✅Flink与Spark Streaming的区别 ✅Flink有哪些部署模式 ✅Flink架构 ✅怎么设置并行度&#xff1f; ✅什么是算子链&#xff1f; ✅什么是任务槽&#xff08;Task Slots&#xff09;&#xff1f; ✅任务槽和并行度的关系 ✅Flink作…

自动化测试入门 —— 自动化测试概论

整篇论述总的来讲会很长&#xff0c;从自动化的思维、模型、工具&#xff0c;到各层次的自动化测试技术、测试框架、测试平台&#xff0c;包括面向未来的自动化技术都将涉及&#xff0c;因此打算拆成几个部分去写。此外&#xff0c;由于涉及的范围比较广泛&#xff0c;部分内容…