我们有许多环境具有多个活动的Spring配置文件,但是应用程序{profile} .yml文件的优先级是什么?
如果我有spring.profiles.active=test-us-west-2-p1, test-us-west-2, test
按什么顺序加载文件application-test.yml, application-test-us-west-2.yml, application-test-us-west-2-p1.yml
?如果我在每个文件中都具有相同的属性,哪个“获胜”?
此外,这是否已从Spring-Boot 1.5.x更改为2.x?看来可能有。
答案 0 :(得分:6)
配置文件的属性按您指定的顺序加载,如果在不同的配置文件中定义了相同的属性,则最后一个赢。
此行为适用于Spring Boot版本1.5.x和2.x,如果我没记错的话,它适用于所有版本的Spring。
Spring始终加载appication.yml。然后,如果指定了一些配置文件,它将加载该配置文件的属性文件。并且,如果在该配置文件之后指定了另一个配置文件,它将加载该配置文件的属性文件。始终用新属性覆盖当前属性的值。
因此,假设您有profile1和profile2。您将拥有以下属性文件:
application.yml:
property1: bob
property2: alice
property3: eve
application-profile1.yml:
property2: alice1
property3: eve1
application-profile2.yml:
property3: eve2
然后您使用以下命令启动应用程序:spring.profiles.active=profile1, profile2
您将得到:
property1: bob
property2: alice1
property3: eve2
答案 1 :(得分:0)
首先,我们需要找出所有活动配置文件的最终集合。有设置/替换活动配置文件和添加活动配置文件的方法。例如,使用spring.profiles.active
命令行选项替换用-Dspring.profiles.active
属性设置的活动配置文件。 (这会变得非常复杂。)
另一方面,SpringApplicationBuilder's
profiles
方法将添加到现有的活动配置文件中。我们可以使用以下代码找出活动配置文件的最终集合:
@Autowired
private Environment environment;
...
System.out.println("Active profiles: " +
Arrays.toString(environment.getActiveProfiles()));
现在,我们必须考虑Spring文档所说的最后胜利策略。
如果指定了多个配置文件,则采用后赢策略。
因此,如果我们有以下代码,但排除了所有其他选项:
new SpringApplicationBuilder(Application.class)
.profiles("dev", "prod")
.run(args);
同时加载application-dev.properties
和application-prod.properties
文件,并且后一个(生产环境)中具有相同名称的键将覆盖前一个。
答案 2 :(得分:0)
我发布了关于配置文件订单处理的重要通知。了解在此过程here中如何处理jar资源文件。