在application.yml中引用gradle属性

时间:2015-10-09 17:17:47

标签: gradle properties reference resolution

如果已经询问并回答了这个问题,或者有文档或示例,请原谅我。我花了几个小时在stackoverflow上寻找解决方案,甚至更多时间在gradle文档中并且无法完成这项工作。

我有一个带有非常标准的maven布局的spring boot项目。我正在使用gradle 2.4。这是相关文件的布局:

/gradle.properties
/build.gradle
/settings.gradle
/src/main/resources/application.yml

gradle.properties中,我定义了以下属性:

name=Sample microservice
description=brief description of the service goes here
version=1.0.0-SNAPSHOT

在我的application.yml文件中,我想将相应的spring属性设置为相同的值。 (我想在一个地方一起定义它们并在几个地方使用它们。由于version通常在gradle.properties中定义,我想在那里聚集其余部分。)

我在application.yml中尝试过以下一行,但事情没有按预期运行:

info.app.name: ${name}
info.app.description: ${description}
info.app.version: ${version}

(我也试过${project.name}等等。这也不起作用。)

我运行gradlew properties ...按预期列出了属性值。但是,当我运行构建时,yaml文件会按预期复制到\build\resources\main,但${value}令牌未解析。

我还在build.gradle文件中包含了以下几行,但事情仍未解决。

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

(我的目标是使用执行器/info端点向服务调用者提供这些属性的值。)

任何建议或指向文档的指示都将非常感谢!

3 个答案:

答案 0 :(得分:7)

我最近遇到了同样的情况 - 这对我有用。

TL; DR:在Spring Boot 1.2.5中,application.yml中的info。*属性被/ info忽略;需要将application.properties用于info。* properties。

首先,使用以下内容创建src / main / resources / application.properties:

info.build.description=${description}
info.build.name=${name}
info.build.version=${version}

其次,将此代码段添加到build.gradle文件中:

processResources {
    filesMatching("**/application.properties") {
        expand( project.properties )
    }
}

接下来,正常运行您的构建。这将处理application.properties文件,并在将文件复制到build / resources / main / application.properties时将变量替换为其构建时值。

对我来说,在运行已部署的.jar时,我的/ info端点会填充扩展值,这是目标。

请注意,对于奖励积分,您可以将其添加到build.gradle以获取/ info端点中的Git信息:

apply plugin: "com.gorylenko.gradle-git-properties"

您还需要将此添加到build.gradle的dependencies部分,以便工作:

classpath 'gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.+'

希望这有帮助!

答案 1 :(得分:2)

您是否考虑过使用复制任务?在那里,您可以定义要扩展的变量:

application.yml:

info.app.name: ${project.name}
info.app.description: ${project.description}
info.app.version: ${project.version}
info.app.foo: ${foo}

的build.gradle:

task copyConfig(type: Copy) {
  from ('src/main/resources') 
  into 'build/config'

  // refer to project and replace foo by string bar
  expand(project: project, foo: 'bar')

}

如果您想保持属性分离,您还可以参考属性文件:

expand(project.properties)

您可能需要查看gradle doc:https://docs.gradle.org/current/userguide/working_with_files.html

你明白了吗?

答案 2 :(得分:0)

经过更多的修补,我发现这些值在运行时得到了扩展。当Spring在环境中定义属性时,$ {value}标记会按照我希望的方式进行扩展。经过深思熟虑后,这就完美无缺了。这些值无法在构建时解析,因为可以在各种位置设置。运行时弹簧属性反映了当前值,无论属性是通过jar中的application.yml设置的,application.yml是坐在jar的旁边,还是通过-d开关来执行jar。