“春天”;spring.profiles.include";覆盖

“春天”;spring.profiles.include";覆盖,spring,spring-boot,spring-profiles,Spring,Spring Boot,Spring Profiles,我的意图是在一个spring引导应用程序中有两个配置文件——开发和生产配置文件。开发概要文件只是为了覆盖生产概要文件的一些变量(比如内存中的数据库,而不是云中的数据库)。正如我期望将来对生产概要进行一些更改一样,在开发概要中复制变量似乎不是一个解决方案 因此,在本文中,我了解到spring.profiles.include应该只添加引用概要文件中的属性 有时,将特定于配置文件的属性添加到活动配置文件中而不是替换它们是很有用的。spring.profiles.include属性可用于无条件添加活动

我的意图是在一个spring引导应用程序中有两个配置文件——开发和生产配置文件。开发概要文件只是为了覆盖生产概要文件的一些变量(比如内存中的数据库,而不是云中的数据库)。正如我期望将来对生产概要进行一些更改一样,在开发概要中复制变量似乎不是一个解决方案

因此,在本文中,我了解到
spring.profiles.include
应该只添加引用概要文件中的属性

有时,将特定于配置文件的属性添加到活动配置文件中而不是替换它们是很有用的。
spring.profiles.include属性可用于无条件添加活动配置文件

然而,从我检查的情况来看,它相当于覆盖了它。因此,当在单独的yaml文件中有两个配置文件foo和bar时:

application-foo.yaml:

myproperty: 44
application-bar.yaml:

spring:
  profiles:
    include: foo
    active: bar,foo
myproperty: 55
在IDE中设置
-Dspring.profiles.active=bar
变量时,
myproperty
的运行时值为44。这意味着,
bar
foo
覆盖,它应该只添加属性,而不是覆盖属性。启动应用程序时,我得到:

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

在另一个问题中,我将
spring.profiles.active=bar
添加到
application bar.yaml
,正如本文所建议的那样,但它没有任何效果-属性存在与否没有区别(我还尝试使用破折号列表而不是逗号分隔的值)

我的问题是,它应该如何工作(那么Spring引用是误导性的)?如果有,有什么解决办法吗


将添加到github上的应用程序源代码。

根据spring引导文档,
spring.profiles.include用于添加来自其他配置文件的属性。如果该属性不在活动配置文件中,它将从其他配置文件中添加该属性。但是如果它存在,那么它将覆盖并应用最后一个

有时,将特定于配置文件的属性添加到活动配置文件中而不是替换它们是很有用的。
spring.profiles.include属性可用于无条件添加活动配置文件


我们以稍微不同的方式实现了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

您可以在
应用程序栏中添加新配置文件。yaml

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

---
spring.profiles: foo-override
myproperty: 55
顺序为:
33(条形)
在foo中被
44覆盖
在foo覆盖中被
55覆盖
给定:

  • 文件:
    application-default.yml、application-foo.yml、application-bar.yml
  • myproperty:application-default.yml中的默认值
  • myproperty:foo
    在application-foo.yml中
  • myproperty:bar
    在application-bar.yml中
我认为这两个使用概要文件的用例在意义上有点相反:

  • 在最常见的情况下(
    -dsspring.profiles.active
    但没有
    spring.profiles.include
    ):

  • 当激活配置文件foo或boo时,将从 application-foo.yml(或application bar.yml)将添加/覆盖 来自application-default.yml的
  • 激活配置文件foo、bar时,bar中的属性将添加/覆盖application-foo.yml中的属性,然后是application-default.yml中的属性
  • 例如:
    -Dspring.profiles.active=foo,bar
    application-bar.yml中的属性将赢得(覆盖)->
    myproperty:bar

  • 在第二种情况下(
    spring.profiles.include

  • include语句中的属性添加/覆盖使用
    spring.profiles.include的application-*.yml文件中的属性
  • 例如:如果
    application-boo.yml
    包含
    spring.profiles.include=foo
    ,则
    application-foo.bar中的属性添加/覆盖application-bar.yml中的属性,该属性添加/覆盖application-default.yml中的属性

    另一方面(我想),如果application-boo.yml包含
    spring.profiles.include=default,foo
    ,那么
    application-foo.yml
    中的属性将添加/覆盖
    application-default.yml
    中的属性,该属性将添加/覆盖
    application-bar.yml
    中的属性。所以
    myproperty:bar
    。我不建议将
    default
    spring.profiles.include
    结合使用,因为这种方式混合了这两种情况,而且考虑到
    application default,覆盖策略是违反直觉的。yml
    在springboot中有特殊处理

    我还承认,我一点也不喜欢在application-*.yml文件中使用
    spring.profiles.active
    。我更喜欢使用系统属性(包括maven)或env变量激活概要文件。在我看来,这让我更清楚地了解了整个概况

    如果根据我(以上)的推理,我走错了路,请告诉我