“春天”;spring.profiles.include";覆盖
我的意图是在一个spring引导应用程序中有两个配置文件——开发和生产配置文件。开发概要文件只是为了覆盖生产概要文件的一些变量(比如内存中的数据库,而不是云中的数据库)。正如我期望将来对生产概要进行一些更改一样,在开发概要中复制变量似乎不是一个解决方案 因此,在本文中,我了解到“春天”;spring.profiles.include";覆盖,spring,spring-boot,spring-profiles,Spring,Spring Boot,Spring Profiles,我的意图是在一个spring引导应用程序中有两个配置文件——开发和生产配置文件。开发概要文件只是为了覆盖生产概要文件的一些变量(比如内存中的数据库,而不是云中的数据库)。正如我期望将来对生产概要进行一些更改一样,在开发概要中复制变量似乎不是一个解决方案 因此,在本文中,我了解到spring.profiles.include应该只添加引用概要文件中的属性 有时,将特定于配置文件的属性添加到活动配置文件中而不是替换它们是很有用的。spring.profiles.include属性可用于无条件添加活动
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变量激活概要文件。在我看来,这让我更清楚地了解了整个概况
如果根据我(以上)的推理,我走错了路,请告诉我