【问题标题】:How to ignore application.properties values if profile set without changing to application-default.properties如果配置文件设置不更改为 application-default.properties,如何忽略 application.properties 值
【发布时间】:2020-06-26 03:28:06
【问题描述】:

我使用 spring 配置文件来加载基于环境的配置,当使用 Autowired Environment 对象读取时,它似乎是环境特定值的附加值,Spring 还从 application.properties 传递值,同样在 spring 文档Profile-specific Properties 中提到也在这里answer,但由于以下限制,我无法更改为 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 中使用具有空值的键在其他环境特定的属性文件中(未使用事件)并在代码中处理,除此之外还有其他优雅的方式来处理而不更改应用程序.properties

【问题讨论】:

    标签: java spring spring-boot spring-profiles


    【解决方案1】:

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

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

    正如Adding Active Profiles 部分所说,您可以使用特定于配置文件的属性添加具有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 文件仍处于加载状态,并且应该包含所有非特定于环境的属性,即所有 common 属性,以及任何全局的 默认 值可能具有特定于环境的值(覆盖)的属性。

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

    【讨论】:

    • 谢谢,这个工作完美,但我需要检查它是否允许另外有 application-default.properties,请问这个,如果我在应用程序中包含配置文件为什么它不起作用。属性,因为作为 spring 两个属性文件是相同的
    • @java_dev 你是什么意思?如果我将spring.profiles.include = foo 添加到application.properties,则配置文件foo 也处于活动状态。
    • 如果将 spring.profiles.include = prod 添加到 application.properties,然后将 prod 额外添加到 JVM 参数提供的配置文件中,但如果我将 prod 添加到 application-default.properties,则只有 JVM 参数提供的配置文件是active 和 prod 仅在没有参数时才处于活动状态
    • @java_dev 您的第一条评论是问“如果我在 application.properties 中包含配置文件为什么它不起作用”,但它正在工作,即将“include”属性放入application.properties激活prod配置文件。由于application.properties总是被处理,这意味着prod配置文件总是被激活,即使使用命令行选项激活另一个配置文件,但是当命令行给出了选项,application-default.properties 没有被处理,所以把属性放在那里使它只包含prod 默认。答案尽在其中。
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2013-09-08
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多