在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(三)开发和发布自己开发的maven插件

系列文章目录

在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包


文章目录

  • 系列文章目录
    • 在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包
  • 前言
  • 一、插件需求
  • 二、maven自定义插件开发
    • 1、准备项目
    • 2、打包发布
  • 二、在项目中使用插件
  • 二、测试结果
  • 总结


前言

在上一节中我们分享了怎么开发和部署自己开发的jar包到maven私有库中,今天给大家介绍如何开发一个maven插件,我们在使用maven时,用的最多的就是maven的插件,而且这也是maven最核心的东西,maven的插件功能能帮助我们在构建、编译、发布项目的时候完成很多事情。有时我们在发布项目时可能会有一些我们定制化的处理,现有的插件都无法满足我们的需求,这时你可以自己开发一个插件来使用,下面我们用一个实际需求的案例来介绍如何开发自己的maven插件。


一、插件需求

记得曾经给一个客户开发了一套系统,采用Java+groovy的模式,大部分核心的逻辑在groovy中来实现,而且为了实现能差量更新,groovy部分将作为升级包,而且不进行编译,直接采用文件加载模式来执行,但是groovy又不能用原文的形式提供给客户,需要进行加密处理,因此为了项目打包方便,便开发了一个自己maven插件,在每次打包后对groovy部分的脚本内容进行加密处理后再统一制作成升级包。当然也可以手工来处理,但是利用maven插件会方便很多,下面给大家具体讲解每一个过程,相关的资源也已上传。

二、maven自定义插件开发

1、准备项目

开发maven插件其实和我们开发一个普通jar包过程是一样的,首先我们需要准备一个项目,
然后在pom.xml下添加如下两个依赖:

<dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.5.0</version>
</dependency>
<dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.5</version><scope>provided</scope>
</dependency>

其次我们在项目中添加一个类,需要继承org.apache.maven.plugin.AbstractMojo,代码如下:

@Mojo(name="encoder",defaultPhase= LifecyclePhase.GENERATE_SOURCES)
public class EncodeMojo extends AbstractMojo {@Parameterprivate String fromPath;@Parameterprivate String toPath;@Parameterprivate String secret;@Parameterprivate String iv;public EncodeMojo(String fromPath, String toPath,String secret, String iv) {this.fromPath = fromPath;this.toPath = toPath;this.secret = secret;this.iv = iv;}public EncodeMojo() {}@Overridepublic void execute() throws MojoExecutionException, MojoFailureException {}
}

@Mojo注解

标识执行的动作,它对应的就是插件中的executions标签,我们可以定义多个Mojo,在使用时可以来执行不同的动作,比如上面我们定义的这个Mojo,在使用时的配置如下:

<executions><execution><phase>generate-resources</phase><goals><goal>encoder</goal></goals></execution>
</executions>

这里的phase和goal就对应上面的Mojo的定义

@Parameter注解

这里是插件的参数,这里需要注意的是,参数需要通过构造函数来初始化,它在实际的使用时对应的是configuration标签,比如上面的定义的配置如下:

<configuration><fromPath>${project.basedir}/script</fromPath><toPath>${project.basedir}/target/script</toPath><secret>720cb14b3151490dad2afaf61d2919fb</secret><iv>af3c77c3c6b747e6ad1006e47a1b8422</iv>
</configuration>

execute方法

插件要具体做的事情就在这个方法中来实现,上面我们的需求就是把fromPath里面的groovy脚本进行加密处理,然后再输出到toPath里面,secret和iv是加密的参数,具体的实现过程大家可以到顶部的资源处下载。

2、打包发布

参照上一节的jar包发布,其实过程都是一样的,如果不清楚可以点击:
在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包

查看,最重要的就是定义pom.xml里面的distributionManagement节点,和本地maven的settings.xml配置。具体不再详解,运行发布命令:

mvn clean -DskipTests deploy

执行完成后,我们登录Nexus后台,检查我们的插件是否发布成功。

在这里插入图片描述

已经发布成功了,下面我们在实际的项目中来使用。

二、在项目中使用插件

我们在准备一个项目来测试刚才我们的插件,根据需求,刚才我们的插件的作用是,把项目中的groovy脚本内容进行加密处理,然后制作成升级包。项目的结构如下:
在这里插入图片描述

现在我们在项目的pom.xml中加入下面的配置:
加入插件仓库源:

<pluginRepositories><pluginRepository><id>test-nexus</id><name>test-nexus</name><url>http://192.168.101.170:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases></pluginRepository>
</pluginRepositories>

添加插件:

<plugin><groupId>com.test</groupId><artifactId>test-mvn-plugin</artifactId><version>1.0</version><configuration><fromPath>${project.basedir}/groovy</fromPath><toPath>${project.basedir}/target/script</toPath><secret>720cb14b3151490dad2afaf61d2919fb</secret><iv>af3c77c3c6b747e6ad1006e47a1b8422</iv></configuration><executions><execution><phase>generate-resources</phase><goals><goal>encoder</goal></goals></execution></executions>
</plugin>

这里的作用就是把groovy目录下的文件,进行加密,然后输出到target/script目录,最后我们需要把script目录下的文件在打包成ZIP:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>package</id><formats><format>zip</format></formats><includeBaseDirectory>true</includeBaseDirectory><fileSets><fileSet><directory>${project.build.directory}/script</directory><outputDirectory>\script</outputDirectory></fileSet></fileSets>
</assembly>

在代码中我们这样使用:

package com.example.testmvnpkgexespringboot;import com.example.testmvnpkgexespringboot.groovy.GroovyCompiler;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.File;
import java.io.IOException;@SpringBootApplication
@RestController
public class TestMvnPkgExeSpringbootApplication {static File script_dir=new File("script");public static void main(String[] args) {SpringApplication.run(TestMvnPkgExeSpringbootApplication.class, args);}@Value("${script.secret}")private String secret;@Value("${script.iv}")private String iv;private GroovyCompiler groovyCompiler=new GroovyCompiler();@RequestMapping("/test/{script}")public Object test(@PathVariable String script){//读取script目录下的文件File file=new File(script_dir,script);if(!file.exists()){return  ResponseEntity.notFound();}//解密groovy脚本String content= null;try {content = FileUtils.readFileToString(file);} catch (IOException e) {return  ResponseEntity.badRequest().body("读取文件异常:"+e.getMessage());}String de_content = AESCBCUtil.decryptAES_CBC(content,script,iv);if(StringUtils.isEmpty(de_content)){return  ResponseEntity.badRequest().body("解密失败");}//执行脚本return  groovyCompiler.compile(script,de_content).run();}}

下面我们进行打包:

mvn clean -DskipTests package

二、测试结果

打包完成后,我们来看下结果:
在这里插入图片描述
我们发现脚本已经加密了,而且文件的后缀也改变了,这些就是在插件中完成的

最后我们来看下运行结果,groovy的原文如下:

def user=["id":1,"name":"csdn"]
return user;

我们来部署我们的项目,结构如下:
在这里插入图片描述
运行项目:

java -jar app.jar

然后访问:http://localhost:12345/test/get_user
在这里插入图片描述

结果和groovy中的代码一致,说明插件能正常使用


总结

1、利用maven的插件功能,不仅能帮助我们来构建项目使用,在有的客户需求其实也只需要开发一个maven插件就能满足,完全可以配合maven来完成一个业务需求。

2、上面项目中大家可以自行根据情况来调整相关的参数,我这里只是为了测试功能

3、maven开发的插件在gradle中也能完全使用

4、maven插件有完全的生命周期,大家可以参照官网的文档

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5调用安卓原生相机API案例

1、在activity_main.xml文件里添加webview标签 <WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"> </WebView> 2、AndroidManifest.xml(权限和活动声明) 开启访问…

如何准备明年游戏行业春招

大学校园招聘一般分春招和秋招。对于很多即将毕业的同学来说&#xff0c;如果秋招时没有收获合适的offer&#xff0c;那么春招就是最后的求职机会。此时更应珍惜&#xff0c;全力以赴。 许多游戏大厂通常会在校招开放基础岗位&#xff0c;这是进入游戏公司的捷径。校招时你的主…

前端JavaScript篇之对 rest 参数的理解、ES6中模板语法与字符串处理

目录 对 rest 参数的理解ES6中模板语法与字符串处理 对 rest 参数的理解 rest参数是一种在函数定义中使用的特殊语法&#xff0c;它允许函数接受任意数量的参数&#xff0c;并将它们收集到一个数组中。通俗地说&#xff0c;rest参数就像是一个容器&#xff0c;用来存放函数接收…

2024/2/2

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08; B &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据有关操…

【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件

RAC 工作原理和相关组件 OracleRAC 是多个单实例在配置意义上的扩展&#xff0c;实现由两个或者多个节点&#xff08;实例&#xff09;使用一个共同的共享数据库&#xff08;例如&#xff0c;一个数据库同时安装多个实例并打开&#xff09;。在这种情况下&#xff0c;每一个单独…

什么是ISO21434网络安全中的信息安全?-亚远景

在ISO 21434标准中&#xff0c;信息安全指的是保护汽车网络、汽车电子系统和与汽车相关的信息免受未经授权的访问、修改、破坏、泄露和干扰的能力。信息安全的目标是确保车辆的电子和通信系统在数字化和互联环境中具备足够的防护&#xff0c;以防范潜在的威胁和攻击。 以下是IS…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

2024年美赛B题:寻找潜水器 Searching for Submersibles 思路模型代码解析

2024年美赛B题&#xff1a;寻找潜水器 Searching for Submersibles 思路模型代码解析 【点击最下方群名片&#xff0c;加入群聊&#xff0c;获取更多思路与代码哦~】 问题翻译 海上游轮迷你潜艇&#xff08;MCMS&#xff09;是一家位于希腊的公司&#xff0c;专门制造能够将人…

基于单片机的直流伺服电机调速系统设计

摘要:直流伺服电机通常在机器手、自动化生产线等数字控制系统中作为执行驱动机构。本文介绍一种基于单片机的直流伺服电机调速系统。其中C8051F020 单片机作为控制核心,通过数码管显示驱动和键盘扫描控制芯片CH452 接收按键输入和显示输出。C8051F020 单片机内部自带的PCA 计…

如何在Windows部署GoLand并通过SSH远程连接Linux服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpolar内…

Vue 环境准备

1.安装vscode https://code.visualstudio.com/ 2.安装开发vue所需插件&#xff1a; Vetur —— 语法高亮、智能感知、Emmet等 包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化选中 代码&#xff0c;两…

【PDF.js】发票PDF不显示文本的问题

控制台提示警告&#xff1a; Warning: loadFont - translateFont failed: "UnknownErrorException: The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided.".…

在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS

要将数据从 Elastic Agent 安全地发送到 Logstash&#xff0c;你需要配置传输层安全性 (TLS)。 使用 TLS 可确保你的 Elastic Agent 将加密数据发送到受信任的 Logstash 服务器&#xff0c;并且你的 Logstash 服务器从受信任的 Elastic Agent 客户端接收数据。 先决条件 确保你…

防御保护 防火墙的双机热备和带宽管理实验

需求&#xff1a; 办公区设备可以通过电信和移动链路上网&#xff08;多对多的NAT&#xff0c;并需要保留一个公网IP不能用来转换&#xff09;分公司设备可以通过总公司的移动和电信链路访问DMZ区的http服务器分公司内部的客户端可以通过公网地址访问到内部的服务器FW1和FW4组…

wpf 引入本项目的图片以及引入其他项目的图像资源区别及使用方法

在WPF项目中引入本项目的图片和引入其他项目的图像资源&#xff0c;两者的主要区别在于资源的位置以及如何通过URI引用它们。以下是详细说明及使用方法&#xff1a; ​ 一、引入本项目的图片资源&#xff1a; 将图片文件&#xff08;如PNG, JPG等&#xff09;放入你的WPF项目…

Unity | YooAssetV2.1.0 + HybridCLR热更新

目录 一、项目更改 二、使用YooAsset热更 1.资源配置 2.资源构建 3.将两个文件夹下的资源上传CDN服务器 4.修改代码 5.运行效果 本文记录利用YooAssetHybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版&#xff0c;dll(原生文件)和资源要建两个p…

AI-数学-高中-18-三角函数-同角三角函数关系及计算

原作者视频&#xff1a;三角函数】5同角三角函数关系&#xff08;易中档&#xff09;_哔哩哔哩_bilibili 辅助三角形&#xff08;计算速度快&#xff09;&#xff1a;1.画一个辅助计算的任意直接三角形&#xff1b;2.利用初中方法先计算sin、cos、tan值&#xff1b;3.看象限确定…

Python机器学习:样本划分之验证集法

评估机器学习模型优劣的标准是模型的泛化能力&#xff0c;所以关注的应该是泛化误差而不是经验误差&#xff0c;一味追求经验误差的降低&#xff0c;就会导致模型“过拟合”现象。但是泛化误差是难以直接观察到的&#xff0c;我们应该如何选择泛化能力比较好的模型呢&#xff1…

蓝桥杯---垒骰子

赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01;我们先来规范一下骰子&#xff1a;1的对面是4&…

【Docker篇】Linux安装Docker、docker安装mysql、redis、rabbitmq

1.Linux安装docker 官方帮助文档&#xff1a;Install Docker Engine on CentOS | Docker Docs 1.1安装命令 # 1. 卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…