项目版本号生成

需求

项目想要生成一个更新版本号,格式为v2.0.20250101

其中v2.0为版本号,更新时进行配置;20250101为更新日期,版本更新时自动生成

实现思路

创建一个配置文件version.properties,在其中配置版本号;

# 版本号
version.number=v2.0
# 版本更新时间
version.build-date=maven-build-timestamp

再写一个类VersionController读取配置文件中的属性值

同时定义一个接口,将version.numberversion.build-date拼接后返回,即为版本号

前端调用这个接口,拿到版本号后展示。

如何读取自定义配置文件,可以看我写的这篇文章:读取自定义配置文件的属性值

Maven replacer插件替换更新时间

这里有一个比较麻烦的点是,版本更新时间 我不想手动去写,而是在版本更新时自动生成就好。

这里就要用到 maven 的一个插件 replacer,这个插件可以在 maven 构建过程中执行文本替换操作

因此,使用这个插件,在 maven 打包时将配置文件version.propertiesversion.build-date 值,替换为 maven 的打包时间,即实现了版本更新时间的自动生成。

<build><plugins><!--replacer插件,用于替换src/main/resources/version.properties中的版本更新时间,以生成版本号--><plugin><groupId>com.google.code.maven-replacer-plugin</groupId><artifactId>replacer</artifactId><version>1.5.3</version><executions><execution><!-- 可以在这个阶段进行代码编译、资源文件处理、生成文档、运行单元测试等;使用这个无法直接替换class文件的值 --><!--<phase>prepare-package</phase>--><!-- 可以在这个阶段设置一些默认的属性值、配置系统属性、加载外部资源文件等 --><phase>initialize</phase><goals><goal>replace</goal></goals></execution></executions><configuration><!--指定文件路径--><basedir>${basedir}/src/main/resources</basedir><!--指定具体的文件名--><includes><include>**/version.properties</include></includes><replacements><replacement><!--替换的目标文本--><token>maven-build-timestamp</token><!--替换后的值--><value>${maven.build.timestamp}</value></replacement></replacements></configuration></plugin></plugins>
</build>

完整代码

定义配置文件src/main/resources/version.properties

# 版本号
version.number=v2.0
# 版本更新时间
version.build-date=maven-build-timestamp

pom.xml 中使用 replacer插件:

  • 插件效果:在 maven 打包时将配置文件version.propertiesversion.build-date 值,替换为 maven 的打包时间
  • 打包时间的格式可以通过 properties 属性maven.build.timestamp.format更改。
<properties><!--定义打包时间的格式--><!--yyyyMMddHHmmss--><maven.build.timestamp.format>yyyyMMdd</maven.build.timestamp.format>
</properties><build><plugins><!--replacer插件,用于替换src/main/resources/version.properties中的版本更新时间,以生成版本号--><plugin><groupId>com.google.code.maven-replacer-plugin</groupId><artifactId>replacer</artifactId><version>1.5.3</version><executions><execution><!-- 可以在这个阶段进行代码编译、资源文件处理、生成文档、运行单元测试等;使用这个无法直接替换class文件的值 --><!--<phase>prepare-package</phase>--><!-- 可以在这个阶段设置一些默认的属性值、配置系统属性、加载外部资源文件等 --><phase>initialize</phase><goals><goal>replace</goal></goals></execution></executions><configuration><!--指定文件路径--><basedir>${basedir}/src/main/resources</basedir><!--指定具体的文件名--><includes><include>**/version.properties</include></includes><replacements><replacement><!--替换的目标文本--><token>maven-build-timestamp</token><!--替换后的值--><value>${maven.build.timestamp}</value></replacement></replacements></configuration></plugin></plugins>
</build>

定义类 VersionController:

  • 使用 @PropertySource 读取配置文件,@Value 读取配置文件的属性值。
  • 接口方法 getVersion 中将 versionNumber 和 buildDate,使用.拼接后返回。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@PropertySource(value = {"classpath:version.properties"})
@RequestMapping("/version")
public class VersionController {@Value("${version.number}")private String versionNumber;@Value("${version.build-date}")private String buildDate;@GetMappingpublic String getVersion() {return String.join(".", versionNumber, buildDate);}}

测试

项目执行 maven 打包命令

在这里插入图片描述

找到打包后的 jar 目录
在这里插入图片描述

目录中输入 cmd 进入命令行窗口,命令行执行java -jar jar包名启动项目(jar包名 需替换为你自己的)
在这里插入图片描述

进行浏览器访问接口验证

在这里插入图片描述

版本更新时的操作

在版本更新时,需要去修改配置文件version.propertiesversion.number 版本号数字,之后 git push 本次修改。

然后,使用 Jenkins 重新打包项目,版本号就会自动更新。


如果有帮助的话,可以点个赞支持一下嘛🙏

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

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

相关文章

c# —— StringBuilder 类

StringBuilder 类是 C# 和其他一些基于 .NET Framework 的编程语言中的一个类&#xff0c;它位于 System.Text 命名空间下。StringBuilder 类表示一个可变的字符序列&#xff0c;它是为了提供一种比直接使用字符串连接操作更加高效的方式来构建或修改字符串。 与 C# 中的 stri…

数据守护者:备份文件的重要性及自动化备份实践

在信息化社会&#xff0c;数据已成为企业运营和个人生活的重要组成部分。无论是企业的核心业务数据&#xff0c;还是个人的珍贵照片、重要文档&#xff0c;数据的丢失或损坏都可能带来无法估量的损失。因此&#xff0c;备份文件的重要性愈发凸显&#xff0c;它不仅是数据安全的…

ScoreFlow:通过基于分数的偏好优化掌握 LLM 智体工作流程

25年2月来自 U of Chicago、Princeton U 和 U of Oxford 的论文“ScoreFlow: Mastering LLM Agent Workflows via Score-based Preference Optimization”。 最近的研究利用大语言模型多智体系统来解决复杂问题&#xff0c;同时试图减少构建它们所需的手动工作量&#xff0c;从…

数值分析与科学计算导引——误差与算法举例

文章目录 第一章 数值分析与科学计算导引1.1 数值分析的对象、作用与特点数值分析的对象数值分析的作用数值分析的特点 1.2 数值计算的误差误差分类误差与有效数字数值运算的误差估计 1.3 算法举例秦九韶算法求多项式值开根号迭代算法牛顿切线加权平均的松弛技术 第一章 数值分…

【在时光的棋局中修行——论股市投资的诗意哲学】

在时光的棋局中修行——论股市投资的诗意哲学 引子&#xff1a;数字之海与星辰之约 在经纬交织的K线图里&#xff0c;我常看见银河倾泻的轨迹。那些跳动的数字如同繁星坠落&#xff0c;在午夜时分编织着财富的密码。炒股之道&#xff0c;是理性与诗意的交响&#xff0c;是数据…

线上项目报错OOM常见原因、排查方式、解决方案

概述 OutOfMemoryError&#xff08;OOM&#xff09;是 Java 应用程序中常见的问题&#xff0c;通常是由于应用程序占用的内存超过了 JVM 分配的最大内存限制。在 Spring Boot 项目中&#xff0c;OOM 问题可能由多种原因引起。 1. OOM 的常见原因 OOM 通常由以下几种情况引起&…

java练习(27)

ps&#xff1a;练习来自力扣 删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 代码来自官方题解 class Solution {public ListNode deleteDuplicates(ListNode head) {//…

Flutter:动态表单(在不确定字段的情况下,生成动态表单)

关于数据模型&#xff1a;模型就是一种规范约束&#xff0c;便于维护管理&#xff0c;在不确定表单内会出现什么数据时&#xff0c;就没有模型一说。 这时就要用到动态表单&#xff08;根据接口返回的字段&#xff0c;生成动态表单&#xff09; 1、观察数据格式&#xff0c;定义…

洛谷P8707 [蓝桥杯 2020 省 AB1] 走方格

#include <iostream> using namespace std; int f[31][31]; int main(){int n,m;scanf("%d%d",&n,&m);f[1][1]1;//边界&#xff1a;f(1,1)1for(int i1;i<n;i)for(int j1;j<m;j)if((i&1||j&1)&&(i!1||j!1))//i,j不均为偶数&#…

ASP.NET Core Web应用(.NET9.0)读取数据库表记录并显示到页面

1.创建ASP.NET Core Web应用 选择.NET9.0框架 安装SqlClient依赖包 2.实现数据库记录读取: 引用数据库操作类命名空间 创建查询记录结构类 查询数据并返回数据集合 3.前端遍历数据并动态生成表格显示 生成结果:

解决 Linux 中搜狗输入法导致系统崩溃的问题【fcitx 】【ibus】

在 Linux 系统中安装搜狗输入法时&#xff0c;有时会遇到一些令人头疼的问题。最近&#xff0c;我在安装搜狗输入法后&#xff0c;系统出现了崩溃的情况。具体表现为输入密码登录后&#xff0c;界面卡死&#xff0c;无法正常进入系统。经过一番排查和分析&#xff0c;我终于找到…

如何做好项目变更管理

项目变更管理是确保项目按时、按预算和按质量要求完成的关键环节之一。有效的项目变更管理包括&#xff1a;变更识别、变更评审、变更批准和变更实施。这些步骤确保项目在面对变化时能够高效应对&#xff0c;避免资源浪费、时间延误和预算超支。其中&#xff0c;变更评审和变更…

HarmonyOS-ArkTS基础快速入门

目录 ArkTS 快速入门 ArkTS 快速入门 如图&#xff0c;index.etc里面的内容&#xff08;图中框住的大长方形区域&#xff09;会渲染到预览区中&#xff0c;而console.log(xx,xxx)用于内容的打印&#xff0c;需要在日志中查看打印的内容

【设计模式】【结构型模式】桥接模式(Bridge)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

深度学习(1)-简单神经网络示例

我们来看一个神经网络的具体实例&#xff1a;使用Python的Keras库来学习手写数字分类。在这个例子中&#xff0c;我们要解决的问题是&#xff0c;将手写数字的灰度图像&#xff08;28像素28像素&#xff09;划分到10个类别中&#xff08;从0到9&#xff09;​。我们将使用MNIST…

深入探索 C++17 中的 std::hypot:从二维到三维的欧几里得距离计算

文章目录 1. std::hypot 的起源与背景2. 三维空间中的 std::hypot3. 为什么需要 std::hypot 而不是手动计算&#xff1f;4. 使用 std::hypot 的示例4.1 二维空间中的应用4.2 三维空间中的应用4.3 处理浮点数溢出问题 5. std::hypot 的性能与精度6. 实际应用场景6.1 计算机图形学…

面基Spring Boot项目中实用注解一

在Spring Boot项目中&#xff0c;实用注解根据功能可以分为多个类别。以下是常见的注解分类、示例说明及对比分析&#xff1a; 1. 核心配置注解 SpringBootApplication 作用&#xff1a;标记主启动类&#xff0c;组合了Configuration、EnableAutoConfiguration和ComponentScan…

【每日论文】Latent Radiance Fields with 3D-aware 2D Representations

下载论文或阅读原文&#xff0c;请点击&#xff1a;每日论文 摘要 中文 潜在3D重建技术在赋予3D语义理解和3D生成能力方面展现出巨大的潜力&#xff0c;它通过将2D特征提炼到3D空间来实现。然而&#xff0c;现有的方法在2D特征空间和3D表示之间的领域差距问题上挣扎&#xff…

CPP集群聊天服务器开发实践(七):Github上传项目

github链接&#xff1a;GitHub - arduino-ctrl/ClusterServer: 基于jsonmuduomysqlnginxredis的集群服务器与客户端通信源码 步骤如下&#xff1a; 1. github新建代码仓库&#xff0c;复制url 2. git clone https://github.com/arduino-ctrl/ClusterServer.git 3. 将项目文件…

作业。。。。。

顺序表按元素删除 参数&#xff1a;删除元素&#xff0c;顺序表 1.调用元素查找的函数 4.根据下表删除 delete_sub(list,sub); //删除元素 void delete_element(int element, Sqlist *list) …