基于Maven的Spring Boot应用版本号获取解析

引言

在Spring Boot应用的开发和部署中,了解应用的版本号对于管理和监控应用至关重要。本文将深入解析一种基于Maven打包的Spring Boot应用中,根据不同的运行环境获取应用版本号的解决方案。在开始介绍代码之前,我们先来了解一下可能的文件目录结构,以及获取版本号的思路。

文件目录结构

JAR包运行环境

假设我们的应用被打包成了一个名为 myapp.jar 的可执行 JAR 文件。

myapp.jar
│
├── META-INF
│   └── maven
│       └── group
│           └── artifact
│               └── pom.properties
│
├── com
│   └── example
│       └── MyApp.class
│
└── ...

在这个结构中,META-INF/maven/group/artifact/pom.properties 文件包含了版本号信息。

IDE或文件系统运行环境

在IDE或文件系统中,应用以类文件的形式存在,目录结构可能如下:

project-root
│
├── target
│   └── classes
│       ├── com
│       │   └── example
│       │       └── MyApp.class
│       │
│       └── ...
│
├── maven-archiver
│   └── pom.properties
│
└── ...

在这个结构中,target/classes 目录包含了编译后的类文件,而 maven-archiver/pom.properties 文件包含了版本号信息。

有了这两种可能的文件结构,我们可以更清晰地理解下面介绍的代码解决方案。

JAR包运行环境

在JAR包运行环境中,应用被打包成一个可执行的JAR文件。以下是获取版本号的代码实现和思路:

if (classPath.startsWith("jar:")) {return getVersionFromJar(clazz);
}

getVersionFromJar 方法

private String getVersionFromJar(Class<?> clazz) {ProtectionDomain protectionDomain = clazz.getProtectionDomain();CodeSource codeSource = protectionDomain.getCodeSource();try (JarFile jarFile = new JarFile(codeSource.getLocation().getPath())) {Enumeration<JarEntry> entries = jarFile.entries();while (entries.hasMoreElements()) {JarEntry entry = entries.nextElement();if (entry.getName().startsWith("META-INF/maven/") && entry.getName().endsWith("/pom.properties")) {return extractVersion(jarFile.getInputStream(entry));}}} catch (IOException e) {e.printStackTrace();}return null;
}

在JAR包中,我们通过ProtectionDomainCodeSource获取JAR文件的路径,然后遍历JAR包中的条目,寻找包含版本信息的pom.properties文件。最终,调用extractVersion方法提取版本号。

IDE或文件系统运行环境

在IDE或文件系统运行环境中,应用通常以类文件的形式存在。以下是获取版本号的代码实现和思路:

else if (classPath.startsWith("file:")) {// 在IDE或文件系统中获取版本号// 省略部分代码...
}

获取文件路径

String basePath = classPath.substring(0, classPath.indexOf("/classes/"));
basePath = URLUtil.decode(FileUtil.normalize(basePath));

通过解析类文件的路径,我们可以得到应用在文件系统中的基本路径。

读取pom.properties文件

File propertiesFile = Paths.get(basePath, "maven-archiver", "pom.properties").toFile();
if (propertiesFile.exists()) {return extractVersion(FileUtil.getInputStream(propertiesFile));
}

根据基本路径构建pom.properties文件的路径,然后通过文件流获取其中的版本号信息。

结论

通过本文的介绍,我们详细解析了在不同环境下获取Spring Boot应用版本号的代码实现思路。这种灵活的解决方案能够确保在不同的部署环境中都能获取到正确的应用版本号,为开发者提供了更好的应用管理和监控手段。在实际应用中,可以根据这一思路进一步优化和定制,以适应特定的部署场景。

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

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

相关文章

课题学习(十五)----阅读《测斜仪旋转姿态测量信号处理方法》论文

一、 论文内容 1.1 摘要 为准确测量旋转钻井时的钻具姿态&#xff0c;提出了一种新的信号处理方法。测斜仪旋转时&#xff0c;垂直于其旋转轴方向加速度计的输出信号中重力加速度信号分量具有周期性特征&#xff0c;以及非周期性离心加速度分量频率低于重力加速度信号分量频率…

tomcat安全基线检查

介绍 Apache Tomcat 是一款广泛使用的开源Web应用服务器,它主要实现了Java Servlet、JavaServer Pages (JSP) 和 Java Expression Language 规范,使得开发者可以构建和部署由Java编写的Web应用程序。作为一个成熟且经过广泛测试的解决方案,Tomcat 在业界享有较高的声誉,特别…

三、jvm中的对象及引用

一、对象在jvm的创建过程 检查加载-->分配内存-->内存空间初始化-->设置-->对象初始化 1) 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查类是否已经被加载、解析和初始化过。 虚拟机遇到一条 new 指令时&#xf…

mybatis的分页插件

在mybatis核心配置文件中&#xff1a; 这时已经用了SSM整合&#xff0c;好多像是mapper或者数据源等都移出去了 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""…

Zabbix自定义飞书webhook告警媒介2

说明:适用于7.0及以上版本,低版本可能会有问题。 参数如下: 名称 值EVENT.DURATION{EVENT.DURATION}EVENTDATE

当使用RSA加密,从手机前端到服务器后端的请求数据存在+

将转成了空格&#xff0c;导致解密出错 将空格转成了

Unity中Batching优化的GPU实例化(1)

文章目录 前言一、GPU实例化的规则1、必须满足 Mesh 网格一样2、只有OpenGL es 3.0及以上才支持&#xff08;3.0及以上有部分硬件可能也不支持&#xff09; 二、GPU实例化的应用场景1、公开几个成员属性&#xff0c;用于存放可以调整的数据2、用Random.insideUnitCircle随机生成…

【头歌系统Python实验】学习-Python元组之应用一

如果对你有帮助的话&#xff0c;不妨点赞收藏评论一下吧&#xff0c;爱你么么哒&#x1f618;❤️❤️❤️ 第1关&#xff1a;学习-Python元组之应用一 任务描述 本关任务&#xff1a;给定 a、b、c 三个变量&#xff0c;三个变量的值都是通过 input 函数获取&#xff0c;且都…

AWS re:Invent 2023-亚马逊云科技全球年度技术盛会

一:会议地址 2023 re:Invent 全球大会主题演讲 - 亚马逊云科技从基础设施和人工智能/机器学习创新,到云计算领域的最新趋势与突破,倾听亚马逊云科技领导者谈论他们最关心的方面。https://webinar.amazoncloud.cn/reInvent2023/keynotes.html北京时间2023年12月1日00:30-02:…

day7 note中的所有字符是否在magazine中能找到

bool canConstruct(string ransomNote, string magazine) { int record[26] {0}; //add if (ransomNote.size() > magazine.size()) { return false; } for (int i 0; i < magazine.length(); i) { // 通过record数据记录 magazine里各个字符出现次数 record[magazine[…

VSCode之C++ CUDA入门:reduce的N+1重境界

背景 Reduce是几乎所有多线程技术的基础和关键&#xff0c;同样也是诸如深度学习等领域的核心&#xff0c;简单如卷积运算&#xff0c;复杂如梯度聚合、分布式训练等&#xff0c;了解CUDA实现reduce&#xff0c;以及优化reduce是理解CUDA软硬件连接点的很好切入点。 硬件环境&…

HarmonyOS4.0从零开始的开发教程03初识ArkTS开发语言(中)

HarmonyOS&#xff08;二&#xff09;初识ArkTS开发语言&#xff08;中&#xff09;之TypeScript入门 浅析ArkTS的起源和演进 1 引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类…

http和https的区别有哪些

目录 HTTP&#xff08;HyperText Transfer Protocol&#xff09; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; 区别与优势 应用场景 未来趋势 当我们浏览互联网时&#xff0c;我们经常听到两个常用的协议&#xff1a;HTTP&#xff08;HyperText Tra…

Excel 动态拼接表头实现导出

public class Column {//单元格内容private String content;//字段名称&#xff0c;用户导出表格时反射调用private String fieldName;//这个单元格的集合private List<Column> listTpamscolumn new ArrayList<Column>();int totalRow;int totalCol;int row;//exc…

易宝OA 两处任意文件上传漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA系统UploadFile、BasicService.asmx等接口处存在文件上传漏洞,未授权的攻击者可…

记录 | vscode pyhton c++调试launch.json配置

下面提供 vscode 中 python 和 c 调试配置的 launch.json (好用&#xff0c;已用好几年&#xff0c;建议收藏) {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387&qu…

【Spring】依赖注入之属性注入详解

前言&#xff1a; 我们在进行web开发时&#xff0c;基本上一个接口对应一个实现类&#xff0c;比如IOrderService接口对应一个OrderServiceImpl实现类&#xff0c;给OrderServiceImpl标注Service注解后&#xff0c;Spring在启动时就会将其注册成bean进行统一管理。在Co…

WireShark监控浏览器登录过程网络请求

软件开发中经常前后端扯皮。一种是用Chrome浏览器的开发者工具 来看网络交互&#xff0c;但是前提是 网络端口的确是通的。 WireShark工作在更低层。 这个工具最大的好处&#xff0c;大家别扯皮&#xff0c;看网络底层的log&#xff0c;到底 你的端口开没开&#xff0c; 数据…

计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

一、实验原理&#xff1a; 1、显示图像 void imshow(const string &name, InputArray image); ①功能&#xff1a;在指定窗口中显示图像。 ②参数&#xff1a;name为窗口的名字&#xff1b;image为待显示的图像。 ③说明&#xff1a;可显示彩色或灰度的字节图像和浮点数图…

C++ 中的运算符重载(三)

重载加法运算符和减法运算符-&#xff0c;用于实现对象的加法和减法。加法运算符和减法运算符-是两种常用的运算符&#xff0c;它们可以对两个操作数进行加法和减法运算&#xff0c;返回一个运算结果。但是&#xff0c;如果我们想要对自定义类型的数据进行加法和减法运算&#…