【问题标题】:Including profiles in spring boot 2.4.0 version在 spring boot 2.4.0 版本中包含配置文件
【发布时间】:2021-03-02 13:59:10
【问题描述】:

作为开发人员,我在本地开发环境中使用默认的 dev 配置文件。这是我的application-dev.properties 文件的一部分:

# Profiles    
spring.profiles.include=auth

之前我使用 Spring Boot 2.3.0.RELEASE 并且 spring.profiles.include 属性在运行时包含 auth 配置文件。

但是在我迁移到 Spring Boot 2.4.0 之后,我没有启用 auth 配置文件。 spring.profiles.include 属性似乎不像以前那样工作了。

请告诉我如何配置我的配置文件,以便获得与迁移前相同的结果。 (我不想在这里使用个人资料组)

提前致谢!

【问题讨论】:

    标签: java spring spring-boot profile spring-profiles


    【解决方案1】:

    如果您的配置处理以不兼容的方式更改并且您希望使用“旧”处理方式,您可以通过设置重新启用它:

    spring.config.use-legacy-processing=true
    

    或者,使用 YAML:

    spring:
      config:
        use-legacy-processing: true
    

    这应该将配置处理恢复为2.3.x 等效项。但请注意,此属性的存在只是为了简化配置文件配置从 2.3.x2.4.x 的迁移,并且可能会在未来的主要版本中被弃用和删除1,因此您仍然应该尝试尽快迁移。要了解此更改的原因和一些其他信息,请继续阅读。

    2.4.0 中值得注意的是以下两种范式:

    因此,在 Spring Boot 2.4 中,我们计划对属性和 YAML 文件的加载方式进行两项重大更改:

    1. 文档将按照定义的顺序加载。

    2. 无法再从个人资料特定文档激活个人资料。

    实际上,这一更改使 what-overrides-what-when 逻辑更易于理解,但导致不得不禁用某些功能。例如:

    my.prop: test
    
    ---
    spring.profiles: prodprops
    my.prop: prod
    
    ---
    spring.profiles: prod
    # no longer works - activating a profile from a profile-specific document!
    spring.profiles.include: prodprops
      
    

    将导致异常,因为配置尝试从特定于配置文件的文档中激活配置文件,这不再被允许。

    为了涵盖此用例(和其他用例),配置文件组已添加为一项功能。这意味着要启用您以前的行为,您需要创建一个配置文件组,如下所示:

    spring.profiles.group.<group>=dev, auth
    

    或者,在 YAML 中:

    spring:
      profiles:
        group:
          <group>: dev, auth
    

    &lt;group&gt; 是您选择的个人资料组的名称。请注意,您可以定义多个组,所有组都应具有不同的名称。如果您随后使用 &lt;group&gt; 配置文件启动应用程序,则应激活属于该组的所有配置文件。

    附带说明,Spring Boot 2.4.0 还添加了对多文档 properties 文件的支持,如下所示:

    test=value
    spring.profiles.active=local
    #---
    spring.config.activate.on-profile=dev
    test=overridden value
    

    注意文档分隔符 (#---)。这允许您在 .properties 文件中拥有与在 .yml 文件中类似的覆盖逻辑。

    同样,相关update post 中提供了此信息和其他信息。

    1 如果有任何迹象表明先前的弃用,则应最早在 2.5.0 或最晚在 2.6.0 中删除该属性,后者更有可能(并且自2.5.x)。

    【讨论】:

      【解决方案2】:

      虽然我们在上面有一个公认的答案。但我会通过多个文件分享我的解决方案。 我的项目中有多个配置文件

      ./
      application.yml
      application-auth.yml
      application-mockauth.yml
      application-datasource.yml
      

      application-auth.yml 或 application-datasource.yml 的主体与我们在 Spring Boot 2.4 之前实现的相同。小幅调整将位于 application.yml 中

      spring:
        profiles:
          group:
            "dev": "datasource,mockauth"
            "prod": "datasource,auth"
      

      您将使用环境名称(dev、prod...)对相关配置进行分组,而不是 spring.profiles.include。

      【讨论】:

        【解决方案3】:

        您可以使用spring.config.import 使用classpath:

        spring.config.import=classpath:application-DEV.yml,classpath:application-auth.yml
        

        【讨论】:

        • IMO 最好在没有 classpathspring.config.import:application-xxx.yml 的情况下定义
        【解决方案4】:

        您也可以使用spring.config.import 根据此文档Config file processing in Spring Boot 2.4 从其他文件导入配置。

        【讨论】:

          猜你喜欢
          • 2021-03-01
          • 2018-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-05
          • 2020-05-07
          • 2021-06-02
          • 1970-01-01
          相关资源
          最近更新 更多