【问题标题】:Can Spring Boot merge local profile with a bundled profile of the same name?Spring Boot 可以将本地配置文件与同名的捆绑配置文件合并吗?
【发布时间】:2020-01-29 07:31:15
【问题描述】:

Spring Boot 可以在 src/main/resources/ 中捆绑外部应用程序配置和配置文件覆盖。可以在运行时从文件系统加载其他配置文件。

给定捆绑的配置文件

src/main/resources
├── application.yml
└── application-prod.yml

和本地配置

config
└── application-prod.yml

Spring 能否可靠地合并prod 配置文件?如果有,解决冲突的规则是什么?

文档详细介绍了一般配置文件和捆绑配置与本地配置,但似乎没有解决所选配置文件同时具有捆绑配置和本地配置的情况。

Relevant Spring Boot 2.1.3 documentation

【问题讨论】:

  • 订单在顶部的同一部分中指定 -> docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/html/…。这是处理文件的顺序。因此,打包应用程序之外的任何内容都会覆盖其中的内容。
  • 一般顺序,是的(12., 13.);但它在任何地方都没有明确谈论两个位置所代表的相同配置文件。我相信这些是以某种方式组合的,但不确定它们是否应该被组合,或者,如果是,如何
  • 这是加载它们的顺序,因此外部(12)覆盖内部(13)。如前所述,顺序非常清楚。它们没有被合并,而是按该顺序加载和查阅。因此,如果您在 config/application-prod.yml 中有名为 foo.bar 的属性,则该属性优先于内部 application-prod.yml。如果您还指定 --foo.bar 作为命令行参数,它甚至优先于文件。基本上,上述顺序是注册和咨询各个PropertySource 实例的顺序。

标签: java spring spring-boot


【解决方案1】:

我不相信。

我的测试明确证明可以读取任一文件中的 一些 设置(具体来说,我成功地在本地指定了一个不与任何捆绑设置冲突的日志级别),而且 - 有时 - 一些设置不能。

我的实验涉及多个配置文件和重新启动,其中一些肯定是错误指定的。有时我还目睹了不变的设置偶尔会发生变化,但我不确定这是否是方法错误;注意力不集中;或者如果行为真的是不确定的。

无论如何,首先必须考虑这个问题表明这种方法可能会在操作维护期间导致意外和意外的意外。

【讨论】:

  • 验证这一点的最佳方法是将 Spring Boot 执行器添加到您的测试应用程序并查看来自 /acuator/env 端点的响应。在您的情况下,您将在 propertySources 数组中为每个文件看到单独的条目,其名称如 applicationConfig: [file:./config/application-prod.yml]applicationConfig: [classpath:/application-prod.yml]applicationConfig: [classpath:/application.yml] 指示每个 PropertySource 的加载位置。这个顺序是一致且可靠的,遵循上面提到的@m-deinum 记录的优先顺序。
猜你喜欢
  • 2017-12-21
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2019-10-19
  • 2017-04-12
  • 2018-07-07
相关资源
最近更新 更多