Spring"spring.profiles.include"覆盖

Dan*_*icz 13 spring spring-profiles spring-boot

我的目的是在spring boot应用程序中有两个配置文件 - 开发和生产.开发配置文件只是为了覆盖生产轮廓一些变量(如内存数据库,而不是数据库云).由于我预计将来会对生产配置文件进行一些更改,因此在开发配置文件中复制变量似乎不是一种解决方案.

因此,在Spring Reference中我读过,spring.profiles.include它应该只添加引用的配置文件中的属性,但是从我检查它的内容中反而覆盖了它.因此,当有两个配置文件foo和bar时,在单独的yaml文件中:

应用foo.yaml:

myproperty: 44
Run Code Online (Sandbox Code Playgroud)

应用bar.yaml:

spring:
  profiles:
    include: foo
    active: bar,foo
myproperty: 55
Run Code Online (Sandbox Code Playgroud)

-Dspring.profiles.active=bar在IDE中设置变量,运行时值为myproperty44.这意味着bar,覆盖foo它应该只添加属性,但不覆盖它们.启动应用程序时,我得到:

以下配置文件处于活动状态:foo,bar

我加入spring.profiles.active=barapplication-bar.yaml这个所建议的答案,在另一个问题,但它没有任何效果-有当时的物业是否有与否没有差别(我也使用破折号上市逗号分隔值,而不是尝试过).

我的问题是,它是如何工作的(那么Spring Reference是误导性的)?如果是这样,有什么解决方案吗?

在github上添加应用程序源代码的链接.

Ind*_*sak 11

我们以稍微不同的方式实现了Spring活动配置文件.假设默认属性文件application.yml包含生产和开发环境中相同的所有默认值.

分别为名为application-prd.yml和的生产和开发文件创建单独的属性application-dev.yml.这些文件可能包含其他属性或覆盖某些默认属性.

在应用程序启动期间,我们将其spring.profiles.active作为环境变量传递.例如,

-Dspring.profiles.active=prd

会随身application-prd.yml携带application.yml

要么

-Dspring.profiles.active=dev

会随身application-dev.yml携带application.yml


M. *_*tin 11

Spring Boot 2.4 更改了包含多个配置文件的机制,以使用新的配置文件组功能,而不是spring.profiles.include在特定于配置文件的文档中使用。这意味着您的配置对于新版本的 Spring Boot 不再有效,需要更改。

\n

也就是说,您的用例似乎不太适合配置文件组,因为它并不是真正组合两个配置文件,而是覆盖默认值。因此,我建议使用另一个答案中建议的方法,将通用属性和默认属性放入共享application.yaml文件中,并且仅在特定于配置文件的文档中包含特定于环境的值和覆盖。

\n

应用程序.yaml

\n
spring:\n  myproperty: 44 # Default value\n
Run Code Online (Sandbox Code Playgroud)\n

应用程序栏.yaml

\n
spring:\n  myproperty: 55 # Override default\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,Spring Boot 支持多文档文件application.yaml,因此如果需要,可以将这些文件组合成一个文件:

\n
spring:\n  myproperty: 44 # Default value\n---\nspring.config.activate.on-profile: bar # These configs apply to the bar profile\nspring:\n  myproperty: 55 # Override default\n
Run Code Online (Sandbox Code Playgroud)\n

相关2.4变更

\n

从 Spring Boot 2.4 开始,不再可能spring.profiles.include在特定于配置文件的文档中使用,除非使用spring.config.use-legacy-processing=true. 根据 2.4 Spring Boot 配置数据迁移指南

\n
\n

您仍然可以使用 spring.profiles.include 属性,但只能在非特定于配置文件的文档中使用。

\n
\n

此方法已被配置文件组功能所取代。根据迁移指南

\n
\n

如上所述,它\xe2\x80\x99s 不再可能spring.profiles.include在特定于配置文件的文档中使用,因此该文件\xe2\x80\x99t 无效。

\n

由于这个用例非常常见,我们\xe2\x80\x99尝试提供另一种方式来支持它。在 Spring Boot 2.4 中,您可以使用\xe2\x80\x9cprofile groups\xe2\x80\x9d功能。

\n
\n

Spring Boot 参考指南的配置文件组部分记录了此功能:

\n
\n

配置文件组允许您为相关配置文件组定义逻辑名称。

\n

例如,我们可以创建一个由我们的和配置文件production组成的组。proddbprodmq

\n
spring:\n  profiles:\n    group:\n      production:\n      - "proddb"\n      - "prodmq"\n
Run Code Online (Sandbox Code Playgroud)\n

现在可以启动我们的应用程序,一键--spring.profiles.active=production激活productionproddb和配置文件。prodmq

\n
\n

迁移指南指出spring.profile.group属性不能在特定于配置文件的文档中使用。

\n
\n

spring.profile.group属性不能在特定于配置文件的文档中使用。

\n
\n


pvp*_*ran 5

根据此处的spring boot文档,spring.profiles.include用于从其他配置文件添加属性。如果该属性不在活动配置文件中,它将从其他配置文件添加该属性。但是,如果存在,它将被覆盖,并且最后一个要应用的将获胜

  • 我知道该链接-它提到“ spring.profiles.include属性可用于无条件添加活动配置文件。” -这个描述对我来说是模棱两可的。但是没关系,有什么办法可以从其他配置文件中导入设置,而不是使它们覆盖当前配置文件吗? (7认同)

小智 5

您可以在以下位置添加新配置文件application-bar.yaml

spring.profiles.include: foo,foo-override
myproperty: 33

---
spring.profiles: foo-override
myproperty: 55
Run Code Online (Sandbox Code Playgroud)

顺序是:33 in baroverridden by44 in foo被覆盖55 in foo-override