【问题标题】:Get value from build.gradle in Spring Batch Project从 Spring Batch 项目中的 build.gradle 获取价值
【发布时间】:2019-03-23 10:16:30
【问题描述】:

我的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}"

【问题讨论】:

  • 如何启动应用程序:从 IDE (eclipse/IDEA)?或来自 gradle 任务(运行或 bootRun)?
  • This 可能会有所帮助。
  • 我从 IDEA 启动项目。
  • application.properties 文件应该已经存在。好吧,除非您没有使用引导初始化程序,否则我想。你把它放在src/main/resources了吗?
  • 在从 Idea 启动您的应用之前尝试运行 gradle 进程资源任务

标签: java spring spring-boot gradle


【解决方案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 任务。这应该会在您每次运行应用程序时正确替换占位符。


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

【讨论】:

  • 我试了一下,但仍然有问题(我为我的问题添加了解释)。感谢您对 Gradle 的解释。我发现它很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 2012-11-28
  • 1970-01-01
  • 2015-04-13
  • 2019-05-18
相关资源
最近更新 更多