我的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)
}
}
哪个也不成功。
我做了这个回答中所说的(我必须添加一个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}"
答案 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项目版本注入到应用程序中。有多种方法可以完成此操作,但是上面的资源处理方法是一种非常常见的方法。