在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.hqwc.cn/news/455097.html

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

相关文章

neo4j查询id为null

今天在neo4j里执行一条查询语句时&#xff0c;发现id属性查询不出来显示为null 后来了解到&#xff0c;Neo4j 默认情况下并不提供一个名为 id 的属性。通常情况下&#xff0c;Neo4j 中的节点都有一个内部的唯一标识符&#xff0c;但是这个标识符并不以 id 的形式暴露给用户。 …

LLMs之miqu-1-70b:miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略

LLMs之miqu-1-70b&#xff1a;miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略 目录 miqu-1-70b的简介 miqu-1-70b的安装和使用方法 1、安装 2、使用方法 miqu-1-70b的案例应用 miqu-1-70b的简介 2024年1月28日&#xff0c;发布了miqu 70b&#xff0c;潜在系列中的…

Google MobileDiffusion: 移动端设备上的快速文字到图片生成技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

多线程生命周期与通信(二)通信

线程自启动时&#xff0c;就拥有了自己的栈空间。然后会一直运行直到结束。多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度&#xff0c;如果线程仅仅是孤零零的执行&#xff0c;不同的逻辑业务就不能最终汇聚成一个完整的业务那么多线程也就失去了意…

02-Web应用_架构构建_漏洞_HTTP数据包_代理服务器

Web应用_架构构建_漏洞_HTTP数据包_代理服务器 一、网站搭建前置知识1.1 域名1.2、子域名1.3、DNS二、web应用环境架构类三、web应用安全漏洞分类四、web请求返回过程数据包 五、演示案例5.1、架构-Web应用搭建-域名源码解析5.2、请求包-新闻回帖点赞-重放数据包5.3、请求包-移…

2024.2.4 awd总结

防御阶段 感觉打了几次awd&#xff0c;前面阶段还算比较熟练 1.ssh连接 靶机登录 修改密码 [root8 ~]# passwd Changing password for user root. New password: Retype new password: 2.xftp连接 备份网站源码 我觉得这步还是非常重要的&#xff0c;万一后面被删站。。…

Java-并发高频面试题-2

接着之前的Java-并发高频面试题 7. synchronized的实现原理是怎么样的&#xff1f; 首先我们要知道synchronized它是解决线程安全问题的一种方式&#xff0c;而具体是怎么解决的呢&#xff1f;主要是通过加锁的方式来解决 在底层实现上来看 是通过 monitorenter、monitorexit…

零售新业态,让老牧区焕发新生命

敦煌老马一声魔性“浇给”勾起了无数人对羊肉的食欲&#xff0c;而当大家集体涌入餐厅或者在网上下单&#xff0c;都想要尝一尝网红同款的时候&#xff0c;可能并没有想过这样一个问题——为什么在今天&#xff0c;即便是远离牧区的现代大城市&#xff0c;草原羊肉却一样能触手…

2、ChatGPT 在数据科学中的应用

ChatGPT 在数据科学中的应用 ChatGPT 可以成为数据科学家的绝佳工具。以下是我所了解到的关于它擅长的地方和不那么擅长的地方。 我从使用 ChatGPT 中学到了一个教训。它在数据科学中非常有帮助,但你必须仔细检查它输出的所有内容。它非常适合某些任务,并且可以非常快速准确…

【Iceberg学习二】Branch和Tag在Iceberg中的应用

Iceberg 表元数据保持一个快照日志&#xff0c;记录了对表所做的更改。快照在 Iceberg 中至关重要&#xff0c;因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本&#xff0c;Iceberg 提供了快照生命周期管理程序&#xff0c;如 expire_snapshots&#xf…

瑞萨RA6M3开发实践指南-UART实践

1.背景说明 本文是参考瑞萨RA6M3开发实践指南文章教程&#xff0c;基于瑞萨HMI-Board BSP :1.1.1 版本 RT-Thread 5.0.1 版本操作步骤进行记录&#xff0c;整理成的文档。 1.1 本章内容 使用RT-Thread Studio创建开发板的程序&#xff0c;编写UART的程序&#xff0c;实现串口…

微软Windows生态是怎么打造成功的?

&#xff08;1&#xff09;2015年Windows10&#xff1a;兼容性 我不得不再次佩服一下微软&#xff0c;Windows10是2015年出品的&#xff0c;但是仍然能正常运行绝大多数的Windows95软件&#xff0c;不用做任何的适配修改&#xff0c;连重新编译都不用&#xff0c;运行照样正常。…