如何在application.properties中引用spring-boot-maven-plugin生成的build-info属性
问题解答
核心结论
可以在application.properties中使用build-info.properties内的属性,你之前引用失败的核心原因是混淆了Maven构建期属性替换和Spring Boot运行期属性加载两个不同阶段的逻辑。
原因说明
@project.artifactId@能正常解析,是Spring Boot默认开启的Maven资源过滤能力,仅能替换Maven构建过程中已存在的原生项目属性。而build-info.properties是spring-boot-maven-plugin的build-info目标在Maven构建后期才生成的文件,资源过滤阶段该文件还不存在,所以不可能通过@build.xxx@的格式在构建期读取到对应属性。- 你尝试的
${build.artifact}如果没生效,大概率是你配置了Maven对${}格式的占位符做构建期过滤,Maven找不到对应的构建属性就会直接留空或报错,该占位符实际应该是Spring Boot运行期解析的语法。
正确使用方式
方式1:运行期直接引用(推荐,直接读取build-info属性)
Spring Boot默认会自动把classpath下META-INF/build-info.properties的内容加载为运行期属性源,你可以直接在application.properties中用${}引用,注意如果你的Maven开启了${}占位符的过滤,需要加转义符:
# application.properties 写法(无Maven ${} 过滤时直接写) my.app.name=${build.artifact} my.app.version=${build.version} # 如果Maven配置了${}过滤,加转义符避免Maven构建期处理 my.app.name=\${build.artifact} my.app.version=\${build.version}
运行期Spring会自动从build-info.properties中读取对应值完成填充,代码中也可以直接通过@Value("${build.artifact}")注入使用。
方式2:构建期用Maven原生属性替换
如果不需要依赖build-info的动态生成逻辑,直接用Maven原生属性占位符即可,build-info的核心属性和Maven原生属性对应关系如下:
| build-info属性 | 对应Maven占位符 |
|---|---|
| build.group | @project.groupId@ |
| build.artifact | @project.artifactId@ |
| build.version | @project.version@ |
| build.time | @maven.build.timestamp@ |
直接在application.properties中写对应占位符,Maven构建时就会自动替换成对应值。
常见踩坑说明
如果运行期还是读取不到build属性,先检查两个点:
- 打包后的jar包内是否存在
BOOT-INF/classes/META-INF/build-info.properties文件,确认build-info目标配置正确且执行成功 - 检查是否自定义了Spring Boot的属性源加载规则,排除了build-info的默认加载逻辑
内容的提问来源于stack exchange,提问作者bastiat
相关产品推荐
相关产品推荐

