将 Gradle 属性注入 Spring Boot application.yml,在 IntelliJ IDEA 中不起作用

Posted

技术标签:

【中文标题】将 Gradle 属性注入 Spring Boot application.yml,在 IntelliJ IDEA 中不起作用【英文标题】:Inject Gradle properties into Spring Boot application.yml, not working in IntelliJ IDEA 【发布时间】:2018-10-11 11:23:02 【问题描述】:

我已经成功地将 Gradle proj.ver 注入到 application.yml 中,然后将其注入到服务应用程序中。 我的 application.yml 如下所示:

project: 
  version: $version

但只有当我从 cli 启动应用程序时它才有效:

gradle bootRun

如果我尝试从 IntelliJ 启动应用程序,它不起作用并且失败:

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

我阅读了 *** 的所有答案,他们提出了两种解决方案:

    使用弹簧型材

    修改运行配置并在启动 gradle 任务之前运行:processResources

当我从 IntelliJ 运行时,我更喜欢 proj.ver 的 default 值。那可能吗?或者对于这种情况有更好的解决方案吗? 谢谢

【问题讨论】:

$version:default 如果没有找到,应该给你一个默认值。 感谢答案,但正如我在答案中所写的那样,似乎只有双方都喜欢这样的工作:$version?:unknown 这不是必需的,因为它是一个值表达式而不是 SpEL 表达式。除非这是由 gradle (它可能是)以某种方式解析的,它会进行替换。 你能说一下你是如何将 gradle 属性注入到 application.yaml 中的吗? 是的,当然,我已经更新了回复。你可以在那里找到步骤。希望对您有所帮助。 【参考方案1】:

正如 M. Deinum 在上面的评论中所说,我设法从 IntelliJ 运行应用程序,但现在 gradle bootRun 开始失败:

原因:groovy.lang.MissingPropertyException:没有这样的属性:类未知:SimpleTemplateScript2

经过更多研究,$version?:unknown带问号)似乎可以在 IDE 或 cli 中工作。


我已经更新了响应,以便其他人知道如何将 Gradle 构建信息注入 Spring-boot:

1) 告诉 Gradle 将构建数据传递给 Spring yml 文件,如下所示:

processResources 
filesMatching('appInfo.yml') 
    expand(project.properties)

2) appInfo.yml 将如下所示:

project:
  version: $version?:unknown

3) 将构建版本注入 Spring 服务,例如:

@Value("$project.version")
private String applicationVersion;

【讨论】:

以上是关于将 Gradle 属性注入 Spring Boot application.yml,在 IntelliJ IDEA 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 Gradle 将系统属性传递到 Spring Boot

Spring boot将配置属性注入到bean类中

Spring Boot 在 Gradle 中获取包的属性

Spring boot 将配置文件属性注入到一个bean中

如何在 Spring Boot 中将属性注入测试类?

spring-boot -配置文件值注入