接口查询SpringBoot版本构建时间
背景
由于公司项目是部署到现场,不同现场用的版本不同,需要提供一个接口查询当前系统部署的版本
思路
利用maven动态获取当前编译时间以及jar包版本(project.version)
通过resource/Filtering将变量替换到我们的文件当中,比如application.yml
那么我们的程序就可以获取到这些值
程序取properties的值
程序要获取jar包版本主要是获取pom.xml里project.version
的值
这里我们需要查看Apache Maven Resources Plugin
插件
经过这个插件可以使我们在程序的文件,比如application.yml里获取到我们想要获取的值
如project.version
,实现原理是通过写指定格式,然后插件会替换对应的值
官方filtering参考文档
示例
新建src/main/resourecs/hello.txt
# src/main/resourecs/hello.txt
Hello ${name}
# 注意如果parent是`spring-boot-starter-parent`,需要使用@name@
Hello @name@
# pom.xml
<project>
<name>My Resources Plugin Practice Project</name>
...
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
...
</resources>
</build>
</project>
# 执行
mvn resources:resources
# 结果1
Hello ${name}
# 修改resource加上filtering
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
# 执行
mvn resources:resources
# 结果2,此时name已经被替换了
Hello My Resources Plugin Practice Project
${}和@…@
关于${}不生效的问题,可能是你使用了spring-boot-starter-parent
需要改成@…@的形式
相关文档
# application.yml,配置后,经过resources插件处理,@project.version@会变成
system:
config:
# build_version: #{project.version}
build_version: @project.version@
# 经过处理后我们可以直接在程序里使用我们熟悉的@Value获取到值使用
@Value("${system.config.build_version}")
private String buildVersion;
maven Model Interpolation
上面我们获取到了版本,现在我们需要获取到编译时间
maven提供了内置变量maven.build.timestamp
为编译开始的时间
默认格式为yyyy-MM-dd'T'HH:mm:ss'Z'
可以通过 maven.build.timestamp.format
格式化
maven.build.timestamp
the UTC timestamp of build start, in yyyy-MM-dd’T’HH:mm:ss’Z’ default format, which can be overridden with maven.build.timestamp.format POM property
我们可以通过${}的形式在pom.xml这种获取到这个变量
<properties>
<!--maven.build.timestamp保存了maven编译时间戳-->
<!-- 经过 maven Model Interpolation 的处理,实际上相当于-->
<!-- <timestamp>2022-6-28 16:03:11</timestamp> -->
<timestamp>${maven.build.timestamp}</timestamp>
<!--指定时间格式-->
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
</properties>
上面这种格式maven会通过Model Interpolation
插值处理帮我们替换,但只限于pom.xml
替换完成后就和我们获取版本的使用方式一样了
system:
config:
# 获取properties的时候可以直接用key取值,一样如果不是使用parent用#{}的写法
build_time: @timestamp@