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的每一个“单词”和“语法”,…...

大数据信用报告查询哪家平台的比较好?
相信在搜索大数据信用的你,已经因为大数据信用不好受到了挫折,想详细了解一下自己的大数据信用,但是找遍了网络上的平台之后才发现,很多平台都只提供查询服务,想要找一个专业的平台查询和讲解很困难。下面本文就为大家…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...