从Spring Batch Project中的build.gradle获取价值

时间:2018-10-18 14:52:59

标签: java spring spring-boot gradle

我的gradle.properties文件中有一些数据:

appVersion=1.4.31
appGroup=com.business
appName=projectName

我希望能够在.java项目中访问它们。我试图像这样访问变量:

@Value("${appVersion}")
private int version; 

但是,当我尝试从主类运行应用程序时,出现以下错误:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'appVersion' in value "${appVersion}"

这表明找不到正确的变量。

尝试解决问题

添加@propertySource注释

我尝试将其添加到主类中 @PropertySource(value = "file:build.gradle", ignoreResourceNotFound = true)失败。

build.gradle中进行更改

我尝试了以下方法,取自this StackOverflow答案:

processResources {
    filesMatching('application.properties'){
        expand(gradle.properties)
    }
}

哪个也不成功。

This下面的答案

我做了这个回答中所说的(我必须添加一个application.properties文件),并且得到了以下错误消息:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Circular placeholder reference 'appVersion' in property definitions

我认为使用相同的名称(appVersion = appVersion)可能会混淆,因此我将application.properties行更改为

version=${appVersion}

然后在我的.java文件中,将行更改为:

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

并收到错误:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'appVersion' in value "${appVersion}"

1 个答案:

答案 0 :(得分:1)

这应该有效:

processResources {
    filesMatching('application.properties'){
        expand(gradle.properties)
    }
}

但是好像您忘记了另一部分。这只是告诉Gradle处理您的application.properties文件并替换找到的所有占位符。您还需要在您的application.properties中放置一个占位符:

version=${appVersion}

然后,您的值注释应该可以工作(但应该是String而不是int

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

最后,由于您是通过IDEA启动的,因此您可能需要确保gradle:processResources在应用程序启动之前运行,以便Gradle有机会替换您放入application.properties的占位符。您应该能够在运行配置中利用“ Before Launch Options”部分,使IDEA在构建任务之后运行processResources Gradle Task。每次运行应用程序时,这都将导致占位符被正确替换。


此外,只是为了帮助理解。 Gradle是应用程序的构建系统,它不是应用程序本身的一部分。项目建成后,与Gradle相关的所有内容都将不相关。这就是为什么您不能只做@Value("${appVersion}")并使其起作用。应用程序/ Spring对用于构建它的工具一无所知(并且也不应该)。因此,如果需要访问,您需要在构建时以某种方式将Gradle项目版本注入到应用程序中。有多种方法可以完成此操作,但是上面的资源处理方法是一种非常常见的方法。