java从构建中获得价值。gradle-in-Spring批处理项目
我的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的答案中尝试了以下内容:
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)混淆,所以我更改了应用程序。属性行到
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 楼答案
这应该是有效的:
但你好像忘了另一部分。这只是告诉Gradle处理
application.properties
文件并替换它找到的任何占位符。您还需要在application.properties
中放置一个占位符:然后,您的值注释应该可以工作(但它应该是
String
而不是int
)最后,由于您是通过IDEA启动的,您可能需要确保
gradle:processResources
在应用程序启动之前运行,以便Gradle有机会替换您在application.properties
中放置的占位符。您应该能够利用运行配置中的“Before Launch Options”部分,让IDEA在构建任务之后运行processResources
Gradle任务。这将导致每次运行应用程序时都正确替换占位符还有,只是为了帮助理解。Gradle是应用程序的构建系统,它不是应用程序本身的一部分。一旦项目建成,与Gradle有关的一切都无关紧要。这就是为什么你不能只做
@Value("${appVersion}")
然后让它工作。应用程序/Spring对用于构建它的工具一无所知(它也不应该知道)。因此,如果您想要访问应用程序,您需要在构建时以某种方式将Gradle项目版本注入到应用程序中。实现这一点的方法有很多,但上面的资源处理方法是一种非常常见的方法