首页 > 解决方案 > 如果配置文件设置不更改为 application-default.properties,如何忽略 application.properties 值

问题描述

我正在使用 spring 配置文件来加载基于环境的配置,并且在使用 Autowired Environment 对象读取时,它似乎是环境特定值的附加值,Spring 还从 application.properties 传递值,同样在 spring 文档Profile-specific Properties和在此答案中,但由于以下限制,我无法更改为 application-default.properties。

对我来说问题/限制是我正在使用的部署平台(规则),对于所有环境,标识符将作为 JVM 参数传递,但对于生产它不会被传递,如下所述

application-dev.properties --> DEV environment will pass this -Dspring.profiles.active=dev
application-qa.properties --> QA environment will pass this -Dspring.profiles.active=qa
application.properties --> PROD environment won't pass any argument

我现在拥有的选项是在 application.properties 中拥有其他环境特定属性文件(未使用事件)中具有空值的键并在代码中处理,除此之外还有其他优雅的方法可以在不更改 application.properties 的情况下进行处理

标签: javaspringspring-bootspring-profiles

解决方案


正如链接文档(Profile-specific Properties)所说,application.properties总是加载。

正如它还说的,如果没有设置活动配置文件(例如使用-Dspring.profiles.active),default配置文件将自动激活。

正如添加活动配置文件部分所述,您可以使用特定于配置文件的属性添加具有该spring.profiles.include属性的活动配置文件。

这意味着您可以让default配置文件属性文件激活prod配置文件,如下所示:

文件application-default.properties

spring.profiles.include = prod

如果你有那个文件,那么在没有-Dspring.profiles.active设置的情况下运行将从这些文件中加载属性(按顺序):

application-prod.properties
application-default.properties
application.properties

如果使用 运行-Dspring.profiles.active=dev,则从这些文件中加载属性(按顺序):

application-dev.properties
application.properties

通过这样做,您现在为每个环境都拥有了一个命名良好的特定于配置文件的属性文件:

application-dev.properties  --> since DEV environment passed -Dspring.profiles.active=dev
application-qa.properties   --> since QA environment passed -Dspring.profiles.active=qa
application-prod.properties --> since PROD environment didn't pass -Dspring.profiles.active

application.properties文件仍被加载,并且应该包含所有非环境特定属性,即所有公共属性,以及可能具有环境特定值(覆盖)的任何全局属性的默认值。

这些application-<profile>.properties文件可以添加特定于环境的属性,并且可以覆盖需要与文件中指定的默认值不同的值的全局属性application.properties


推荐阅读