Maven插件:exec-maven-plugin-代码执行或者直接输出内置变量信息
文章目录
- 概述
- 使用
- 应用
- 自行实现记录项目打包插件
概述
官网: https://www.mojohaus.org/exec-maven-plugin/usage.html
依赖: https://mvnrepository.com/artifact/org.codehaus.mojo/exec-maven-plugin
使用
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.3.0</version> <!-- 请使用最新版本 --><executions><execution><id>unique-id-1</id><phase>validate</phase> <!-- 指定在哪个阶段执行 --><goals><goal>exec</goal></goals><configuration><executable>echo</executable><arguments><argument>${project.build.outputDirectory}</argument><argument>${project.basedir}</argument></arguments></configuration></execution><execution><id>unique-id-2</id><phase>validate</phase> <!-- 指定在哪个阶段执行 --><goals><goal>java</goal></goals><configuration><mainClass>work.linruchang.chatgptweb.maven.MavenRecordGitInfo</mainClass><arguments><argument>lrc</argument><argument>20240707</argument></arguments></configuration></execution></executions></plugin>


应用
自行实现记录项目打包插件
类似同样的功能,可以直接使用Maven的另一款插件:git-commit-id-maven-plugin
MavenRecordGitInfoPlugin.java
@Slf4j
public class MavenRecordGitInfoPlugin {private static String pluginName = "打包信息插件";/*** 获取当前的项目目录** @return*/public static File getCurrentProjectDir(MavenRecordGitInfoConfig mavenRecordGitInfoConfig) {File targetClassDir = FileUtil.file("").getAbsoluteFile();String gitCmd = "{execGitPath} rev-parse --show-toplevel";gitCmd = StrUtil.format(gitCmd, Dict.parse(mavenRecordGitInfoConfig));Process process = RuntimeUtil.exec(new String[0], targetClassDir, gitCmd);String currentProjectDir = StrUtil.trim(IoUtil.readUtf8(process.getInputStream()));return FileUtil.file(currentProjectDir);}/*** 项目打包时的信息** @return*/public static ProjectPackageInfo getProjectPackageInfo(MavenRecordGitInfoConfig mavenRecordGitInfoConfig) {ProjectPackageInfo projectPackageInfo = ProjectPackageInfo.builder().projectPackageTime(DateUtil.now()).projectPackageIp(SystemUtil.getHostInfo().getAddress()).build();String execGitPath = mavenRecordGitInfoConfig.getExecGitPath();if (!EnhanceRuntimeUtil.hasCommand(execGitPath)) {log.warn("【{}】警告:记录打包信息失败,可执行Git指令({})不生效", pluginName, execGitPath);return projectPackageInfo;}File currentProjectDir = getCurrentProjectDir(mavenRecordGitInfoConfig);projectPackageInfo.setProjectPackageDir(FileUtil.getAbsolutePath(currentProjectDir));// 输出格式// commitId: 4216872// commitAuthor: LinRuChang// commitTime: 2024-07-06 14:38:57// commitBranch: (HEAD -> master, origin/master, origin/HEAD)// commitMessage: 修复:【切换】展示用户默认AI模型问题String gitCmd = "{execGitPath} log --format='commitId: %h %ncommitAuthor: %an %ncommitTime: %ad %ncommitBranch: %d %ncommitMessage: %s' --date=format:'%Y-%m-%d %H:%M:%S' -1";gitCmd = StrUtil.format(gitCmd, Dict.parse(mavenRecordGitInfoConfig));String gitInfoRawContent = EnhanceRuntimeUtil.execResult(new String[0], currentProjectDir, gitCmd);if (StrUtil.isBlank(gitInfoRawContent)) {log.warn("【{}】警告:记录打包信息失败,获取不到Git提交信息,请检查", pluginName);return projectPackageInfo;}log.info("【{}】当前Git最新提交信息如下:\n{}", pluginName, gitInfoRawContent);// 去除前后缀的单引号gitInfoRawContent = StrUtil.strip(gitInfoRawContent, EnhanceStrUtil.singleQuotationMark);List<String> gitInfoRawContentS = StrUtil.splitTrim(gitInfoRawContent, StrUtil.LF);Map<String, String> gitParseInfoMap = gitInfoRawContentS.stream().filter(StrUtil::isNotBlank).filter(rowContent -> StrUtil.splitTrim(rowContent, EnhanceStrUtil.COLON).size() > 1).collect(CollectorUtil.toMap(rowContent -> StrUtil.trim(StrUtil.subBefore(rowContent, StrUtil.COLON, false)),rowContent -> StrUtil.strip(StrUtil.trim(StrUtil.subAfter(rowContent, StrUtil.COLON, false)), EnhanceStrUtil.singleQuotationMark),(v1, v2) -> v1));BeanUtil.copyProperties(gitParseInfoMap, projectPackageInfo, true);// 获取具体的分支(HEAD -> master, origin/master, origin/HEAD)String commitBranch = projectPackageInfo.getCommitBranch();if (StrUtil.isNotBlank(commitBranch)) {String branchInfoRawContent = CollUtil.findOne(StrUtil.splitTrim(commitBranch, StrUtil.COMMA), content -> {return StrUtil.containsAnyIgnoreCase(content, "->") && StrUtil.containsAnyIgnoreCase(content, "HEAD");});String simpleCommitBranch = StrUtil.trim(StrUtil.subAfter(branchInfoRawContent, "->", false));projectPackageInfo.setCommitBranch(StrUtil.blankToDefault(simpleCommitBranch, commitBranch));}return projectPackageInfo;}public static void main(String[] args) {try {Console.log("\n===============【{}】开始=======================\n", pluginName);MavenRecordGitInfoConfig mavenRecordGitInfoConfig = MavenRecordGitInfoConfig.parse(ArrayUtil.get(args, 0));log.info("【{}】原始配置参数:{},最终生效的配置参数:{}", pluginName, args, JSONUtil.toJsonStr(mavenRecordGitInfoConfig));ProjectPackageInfo projectPackageInfo = getProjectPackageInfo(mavenRecordGitInfoConfig);String projectPackageInfoJson = StrUtil.nullToEmpty(JSONUtil.toJsonPrettyStr(projectPackageInfo));File packageInfoFile = FileUtil.file(mavenRecordGitInfoConfig.getPackageInfoFileName());FileUtil.writeString(projectPackageInfoJson, packageInfoFile, CharsetUtil.UTF_8);log.info("【{}】当前项目的打包信息【{}】:{}", pluginName, FileUtil.getAbsolutePath(packageInfoFile), projectPackageInfo);} catch (Exception e) {// 必须捕获异常,否则这里面有任何的报错都会阻止项目的打包log.error("【{}】发生未知错误,导致插件崩溃", pluginName, e);} finally {Console.log("\n===============【{}】结束=======================\n", pluginName);}}}
MavenRecordGitInfoConfig.java
/*** @author LinRuChang* @version 1.0* @date 2024/07/08* @since 1.8**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(description = "Git记录插件配置信息")
public class MavenRecordGitInfoConfig {private final static String defaultPackageInfoFileName = "package.info";private final static String defaultExecGitPath = "git";/*** 生成的打包信息文件的文件名*/private String packageInfoFileName = defaultPackageInfoFileName;/*** 生成打包信息时,需使用到Git执行程序,如果未设置成全局可执行命令,必须设置Git绝对路径地址*/private String execGitPath = defaultExecGitPath;public static MavenRecordGitInfoConfig parse(String rawContent) {MavenRecordGitInfoConfig mavenRecordGitInfoConfig = new MavenRecordGitInfoConfig();if(StrUtil.isBlank(rawContent)) {return mavenRecordGitInfoConfig;}Map<String, String> parseConfigInfo = StrUtil.splitTrim(rawContent, StrUtil.COMMA).stream().filter(StrUtil::isNotBlank).map(StrUtil::trim).filter(rowContent -> StrUtil.isNotBlank(StrUtil.subAfter(rowContent, EnhanceStrUtil.equalMark, false))).collect(CollectorUtil.toMap(rowContent -> StrUtil.subBefore(rowContent, EnhanceStrUtil.equalMark, false),rowContent -> StrUtil.subAfter(rowContent, EnhanceStrUtil.equalMark, false),(v1, v2) -> v1));BeanUtil.copyProperties(parseConfigInfo,mavenRecordGitInfoConfig, true);return mavenRecordGitInfoConfig;}public static void main(String[] args) {MavenRecordGitInfoConfig parse = MavenRecordGitInfoConfig.parse("packageInfoFileName=package.info2,git=");Console.log(parse);}}
ProjectPackageInfo.java
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(description = "项目打包信息")
public class ProjectPackageInfo implements Serializable {private static final long serialVersionUID = -7381111550970133734L;@ApiModelProperty("提交记录ID")String commitId;@ApiModelProperty("提交作者")String commitAuthor;@ApiModelProperty("提交的时间")String commitTime;@ApiModelProperty("提交记录所处的分支")String commitBranch;@ApiModelProperty("提交的描述信息")String commitMessage;@ApiModelProperty("项目打包的时间")String projectPackageTime;@ApiModelProperty("项目打包时的IP地址")String projectPackageIp;@ApiModelProperty("项目打包时的项目目录")String projectPackageDir;}
pom.xml
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.3.0</version> <!-- 请使用最新版本 --><executions><!--<execution>--><!-- <id>unique-id-1</id>--><!-- <phase>validate</phase> <!– 指定在哪个阶段执行 –>--><!-- <goals>--><!-- <goal>exec</goal>--><!-- </goals>--><!-- <configuration>--><!-- <executable>echo</executable>--><!-- <arguments>--><!-- <argument>${project.build.outputDirectory}</argument>--><!-- <argument>${project.basedir}</argument>--><!-- </arguments>--><!-- </configuration>--><!--</execution>--><execution><id>unique-id-2</id><!--<phase>validate</phase> <!– 指定在哪个阶段执行 –>--><!--必须这个阶段,validate代码还未编译完成,第一次运行会报类不存在的现象,故需使用compile这个阶段--><phase>compile</phase> <!-- 指定在哪个阶段执行 --><goals><goal>java</goal></goals><configuration><mainClass>work.linruchang.chatgptweb.maven.MavenRecordGitInfoPlugin</mainClass><arguments><argument>packageInfoFileName=package.info,execGitPath=git</argument></arguments></configuration></execution></executions></plugin></plugins>

@Api(tags = "管理员模块(不对外开放)")
@RestController
@RequestMapping("admin")
@Slf4j
public class AdminController {@ApiOperation(value = "查看系统打包版本信息")@GetMapping("/systemPackageInfo")public ResponseResult<ProjectPackageInfo> systemPackageInfo() {String s = ResourceUtil.readUtf8Str(MavenRecordGitInfoPlugin.mavenRecordGitInfoConfigFileName);MavenRecordGitInfoConfig mavenRecordGitInfoConfig = JSONUtil.toBean(s, MavenRecordGitInfoConfig.class);String packInfoContent = ResourceUtil.readUtf8Str(mavenRecordGitInfoConfig.getPackageInfoFileName());ProjectPackageInfo projectPackageInfo = JSONUtil.toBean(packInfoContent,ProjectPackageInfo.class);return ResponseResult.success(projectPackageInfo);}
}

相关文章:
Maven插件:exec-maven-plugin-代码执行或者直接输出内置变量信息
文章目录 概述使用应用自行实现记录项目打包插件 概述 官网: https://www.mojohaus.org/exec-maven-plugin/usage.html 依赖: https://mvnrepository.com/artifact/org.codehaus.mojo/exec-maven-plugin 使用 <plugin><groupId>org.codeh…...
https://ffmpeg.org/
https://ffmpeg.org/ https://www.gyan.dev/ffmpeg/builds/ https://github.com/BtbN/FFmpeg-Builds/releases F:\Document_ffmpeg F:\Document_ffmpeg\ffmpeg-master-latest-win64-gpl-shared\bin...
linux 源码部署polardb-x 错误汇总
前言 在linux 源码部署polardb-x 遇到不少错误,特在此做个汇总。 问题列表 CN 启动报错 Failed to init new TCP 详细错误如下 Caused by: Failed to init new TCP. XClientPool to my_polarx#267b21d8127.0.0.1:33660 now 0 TCP(0 aging), 0 sessions(0 runni…...
vscode用快捷键一键生成vue模板
项目中有些代码模块是固定的,如下面的代码所示,为了不重复写这些相同的代码,我们可以使用快键键一键生成模板。 流程: 中文:首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件(没有vue.j…...
ARM 架构硬件新趋势:嵌入式领域的未来
目录 目录 一、ARM 架构概述 二、新趋势一:AI 加速器集成 三、新趋势二:更高效的电源管理 四、新趋势三:安全性增强 五、结语 随着物联网 (IoT) 和边缘计算的发展,ARM 架构在嵌入式系统中的应用越来越广泛。从智能手机到智能…...
星戈瑞-二油酰磷脂酰乙醇胺标记荧光素 DOPE-FITC
DOPE-FITC,全称为1,2-dioleoyl-sn-glycero-3-phosphoethanolamine-N-FITC,是一种结合了二油酰磷脂酰乙醇胺(DOPE)与荧光素异硫氰酸酯(FITC)的复合标记物。以其独特的磷脂结构和强烈的绿色荧光特性ÿ…...
堆的实现(偷懒版)
🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 目录 前言 一、堆的实现 1.1 堆的向下调整算法 思路: 1.2 堆的向上调整算法 1.3 堆的创建 1.4 堆的复杂度计算 向下调整建堆的复杂度…...
一键启动,智能分拣:3D视觉系统赋能多SKU纸箱高效混拆作业
在快速发展的电商时代,仓储物流面临着前所未有的挑战。尤其是面对成千上万种不同的纸箱,如何实现快速、准确、高效的混拆作业,成为了众多企业亟待解决的问题。幸运的是,随着科技的进步,3D视觉系统正逐步成为这一领域的…...
unity草体渲染方案 GPU Instaning
有一天看项目里的FrameDebug发现在森林系的场景里草体的drawcall差不多有100多 主要是因为灯光贴图,位置等不一样导致的打断合批,导致一个批次只能渲染10个左右的草体 之前有了解过unity有接口(Graphics.DrawMeshInstanced)可以把…...
最近在西安召开的学术会议:EI检索超快,信息系统与计算技术领域!
第十二届信息系统与计算技术国际会议(ISCTech 2024)将于2024年11月8日-11月11日在中国西安盛大举行,由长沙理工大学主办,同济大学、西北工业大学联合协办。会议聚焦信息系统与计算技术等相关研究领域,广泛邀请国内外知…...
sRGB和伽马矫正
sRGB和伽马矫正 1. sRGB的含义: sRGB是一种色彩空间,全称为“标准红色-绿色-蓝色”(standard Red Green Blue)。它由惠普和微软在1996年共同开发,用于确保不同设备上色彩的一致性。 在sRGB中,“s”代表“…...
Summer School science communication project--Laptop Selection Suggestion
目录 Introduction Audiance Usage CPU What is a central processing unit (CPU) Notable makers of CPUs GPU Graphics Card: GPU The classifications of graphics cards The brands of graphics cards Dedicated Graphics Cards GeForce MX Series: GeForc…...
网络编程概念详解模拟回显客户端服务器
目录 1.网络中重要的概念 1)IP地址: 2)端口号: 3)协议 协议分层 OSI七层模型(教科书) TCP/IP五层模型 封装和分用 网络套接字 面试题:TCP/UDP的区别? UDP数据报套接字编程 模拟一个回…...
代码随想录第二十四天|动态规划(8)
目录 LeetCode 300. 最长递增子序列 LeetCode 674. 最长连续递增序列 LeetCode 718. 最长重复子数组 LeetCode 1143. 最长公共子序列 LeetCode 1035. 不相交的钱 LeetCode 53. 最大子序和 LeetCode 392. 判断子序列 总结 LeetCode 300. 最长递增子序列 题目链接&#…...
编程-设计模式 3:单例模式
设计模式 3:单例模式 定义与目的 定义:单例模式确保一个类只有一个实例,并提供一个全局访问点来访问该实例。目的:这种模式通常用于那些需要频繁访问且只需一个实例的对象,例如配置管理器、日志记录器等。 实现示例…...
Kaniko 构建 Docker 镜像
Kaniko 主要用于构建 Docker 镜像,而不是运行程序。它的主要用途是从 Dockerfile 构建容器镜像,但它并不负责运行容器或程序。以下是 Kaniko 的主要功能和局限性: 主要功能 构建镜像:Kaniko 从 Dockerfile 构建容器镜像。它通过…...
Javascript常见算法(每日两个)
合并两个有序链表 在JavaScript中,合并两个有序链表通常指的是将两个已经按照某种顺序(如升序或降序)排列的链表合并成一个新的有序链表。由于JavaScript本身不直接支持链表数据结构,我们通常会用对象或数组来模拟链表的行为。但…...
Spring -- 事务
Spring中事务的操作分为两类:(1)编程式事务 – 手动写代码操作事务(2)声明式事务 – 利用注解开启事务和提交事务 1. 编程式事务 准备Controller RestController RequestMapping("/user") public class UserInfoController {Autowiredprivate UserInfoService use…...
生命密码的破译者:AI如何学会读懂DNA语言?
引言 如果能像解读一本神秘的书籍那样,理解DNA的“语言”,将是多么令人兴奋的科学突破!如今,这正在逐步变为现实。科学家们训练出的AI模型GROVER正如一个勤奋的学生,学习着DNA的每一个“单词”和“语法”,…...
大数据信用报告查询哪家平台的比较好?
相信在搜索大数据信用的你,已经因为大数据信用不好受到了挫折,想详细了解一下自己的大数据信用,但是找遍了网络上的平台之后才发现,很多平台都只提供查询服务,想要找一个专业的平台查询和讲解很困难。下面本文就为大家…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
