将 Gradle.build 版本获取到 Spring Boot 中

问题描述 投票:0回答:5

我正在尝试在视图中显示 Spring Boot 应用程序的应用程序版本。我确定我可以访问此版本信息,只是不知道如何访问。

我尝试遵循以下信息:https://docs.spring.io/spring-boot/docs/current/reference/html/product-ready-endpoints.html,并将其放入我的

application.properties

info.build.version=${version}

然后将其加载到我的控制器中

@Value("${version.test}")
,但这不起作用,我只收到如下错误:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'version' in string value "${version}"

关于将我的应用程序版本、Spring Boot 版本等信息获取到我的控制器的正确方法有什么建议吗?

java spring gradle spring-boot
5个回答
58
投票

您也可以将其添加到

build.gradle
:

springBoot {    
    buildInfo() 
}

然后,你可以使用

BuildProperties
bean :

@Autowired
private BuildProperties buildProperties;

并通过

buildProperties.getVersion()

获取版本

18
投票

如参考文档中描述的,您需要指示 Gradle 处理您应用程序的资源,以便它将用项目的版本替换 ${version}

 占位符:

processResources { expand(project.properties) }
为了安全起见,您可能需要缩小范围,以便仅处理 

application.properties

processResources { filesMatching('application.properties') { expand(project.properties) } }
现在,假设您的财产名为 

info.build.version

,则可以通过 
@Value
:
获取它

@Value("${info.build.version}")
    

3
投票
我通过在 application.yml 中添加以下内容解决了这个问题:

${version?:unknown}

它也可以从 cli:

gradle bootRun 以及 IntelliJ 运行,并且您不必在 IntelliJ 中启动之前调用 Gradle 任务 processResources 或使用 spring 配置文件。

这适用于 Gradle 版本:

4.6 以及 Spring Boot 版本:2.0.1.RELEASE。 希望有帮助;)


2
投票
我是这样解决的: 在

info.build.version

 中定义您的 
application.properties
:

info.build.version=whatever

在你的组件中使用它

@Value("${info.build.version}") private String version;

现在将您的版本信息添加到您的

build.gradle

 文件中,如下所示:

version = '0.0.2-SNAPSHOT'

然后添加一个方法来用正则表达式替换你的 application.properties 来更新你的版本信息:

def updateApplicationProperties() { def configFile = new File('src/main/resources/application.properties') println "updating version to '${version}' in ${configFile}" String configContent = configFile.getText('UTF-8') configContent = configContent.replaceAll(/info\.build\.version=.*/, "info.build.version=${version}") configFile.write(configContent, 'UTF-8') }

最后,确保在触发

build

bootRun
 时调用该方法:

allprojects { updateVersion() }

就是这样。如果您让 Gradle 编译您的应用程序以及从 IDE 运行 Spring Boot 应用程序,则此解决方案有效。该值不会更新,但不会抛出异常,一旦您运行 Gradle,它就会再次更新。

我希望这对其他人有帮助,也为我解决了问题。我找不到更合适的解决方案,所以我自己编写了脚本。


2
投票
对于 Kotlin 用户来说,对我有用的是:

    应用程序.属性
在 application.properties 中添加一个占位符,该占位符将由 gradle 替换为您的值。

project.version= ${version}

    构建.gradle.kts
添加一个任务,以便 gradle 将替换该值

tasks.processResources { filesMatching("**/application.properties") { expand(project.properties) } }

    服务.kt
为您的服务注入价值

@Value("\${project.version}") lateinit var version: String
    
© www.soinside.com 2019 - 2024. All rights reserved.