[spring-projects/spring-boot]Spring Boot 2.0.2 中引入了不同的配置文件优先级 - 包含配置文件现在位于活动之后。

2024-04-17 358 views
1

你好,

与以前的版本相比,Spring Boot 2.0.2 引入了不同的配置文件优先级。

它很容易复制。

  1. 在STS中创建一个Spring boot starter web项目
  2. 在application.properties中添加spring.profiles.include=include
  3. 使用 java -jar ./target/somename-0.0.1-SNAPSHOT.jar --spring.profiles.active=active 构建并运行项目
  4. 您将看到以下配置文件处于活动状态:active,include这是不正确的

将 pom 降级到 Spring boot 2.0.1 并再次运行,您将看到 以下配置文件处于活动状态: include,active 这是正确的

Spring boot 1.5.13 还给出了以下配置文件处于活动状态:include,active

我正在使用 Java 8 和 MacOS High Sierra。

谢谢

回答

2

请参阅https://github.com/spring-projects/spring-boot/issues/11380,其中部分内容更正了记录的配置文件的顺序,以准确反映它们的处理顺序。

您将看到以下配置文件处于活动状态:active,include 这是不正确的

您能解释一下为什么您认为这是不正确的吗?

spring.profiles.active是一个命令行参数,因此它首先被看到并被active激活。application.properties然后读取该点,该点include被激活。鉴于这个顺序active,include似乎是正确的。

3

你好,

如果我解释一下我的用例:

我正在微服务架构中进行部署,因此我创建了一个通用的微服务 Maven 依赖项,其中包含我想要在所有微服务中使用的 Spring Boot 属性: application-microservice.properties ,并且在部署到云时还包含一个通用的覆盖 application-cloud.properties

每个微服务都会引入此 Maven 依赖项,并通过 该服务的本地 application.properties 中的spring.profiles.include=microservice来打开第一个配置文件。

当我部署到云时,我另外添加了命令行参数 --spring.profiles.active=cloud 来打开覆盖。

现在发生的情况是云配置文件属性正在被微服务配置文件覆盖,因此 Spring Boot 2.0.2 对我来说是一个相当大的突破性变化。

为了进一步说明这一点,如果我有一个具有以下属性的 Spring Boot 应用程序

application-cloud.properties
    some.key=cloudprop
application-microservice.properties
    some.key=microserviceprop
application.properties
    spring.profiles.include=microservice

和“cloud”的命令行活动配置文件,然后 Spring Boot <=2.0.1 输出“cloudprop”,而 2.0.2 输出“microserviceprop”

谢谢

7

该附加描述非常有用。谢谢。

5

我似乎遇到了完全相同的问题。里面的任何内容include都会覆盖我的active个人资料。

0

指定我自己来审查此修复

1

@philwebb 我仍然存在 Spring Boot 2.0.3 的问题,包含的配置文件仍然比活动配置文件具有更高的优先级。

我有一个 bootstrap.yml 到类路径中,它尝试包含一个配置文件,在启动应用程序时,我传递活动配置文件。当从配置服务获取属性时,它会优先考虑将配置文件包含到 bootstrap.yml 文件中。

1

关于 Kubernetes ConfigMap 的类似注释,我在 bootstrap.yml 中有以下内容

  cloud:
    kubernetes:
      reload:
        enabled: true
        mode: polling
        period: 5000
      secrets:
        enable-api: false
        enabled: false  
      config:
        enable-api: true
        enabled: true
        sources:
          - name: ${spring.application.name}
          - name: common
          - name: common-sqlserver
          - name: common-doc

控制台输出:

Located property source: CompositePropertySource {name='composite-configmap', propertySources=[ConfigMapPropertySource {name='configmap.common-doc.default'}, ConfigMapPropertySource {name='configmap.common-sqlserver.default'}, ConfigMapPropertySource {name='configmap.common.default'}, ConfigMapPropertySource {name='configmap.we-order-service.default'}]}

我认为排序应该是自上而下还是自下而上?

7

@philwebb @mbhave

很抱歉在这里对一个老问题发表评论,但我的公司正在使用相当旧的 spring-boot 版本(1.5.6.RELEASE),我不确定该版本中是否存在同样的错误。

我似乎面临着同样的问题,其中包含的配置文件使用了spring.profiles.include不应该按照文档覆盖的属性。

我面临的问题是

应用程序-dev.yml

spring:
  profiles:
    include: 
      - 'main-dev'

flyway:
  enabled: true
  location: 'migrations'

应用程序-main-dev.yml

flyway:
  enabled: false

-Dspring.profiles.active=dev当我使用控制台运行时,将活动配置文件打印为main-dev, dev,这似乎是正确的。我期望的是,配置文件中的属性dev将覆盖配置文件中的属性main-dev。但行为恰恰相反,flyway 自动配置类看到的flyway.enabled值为false

我希望你能为我回答的是

  1. 1.5.6.RELEASE 中是否存在导致此问题的错误? (然后我将坚持我的工作)
  2. 或者我在包含属性文件的方式上做错了什么?
2

@kapad 1.5.x 中的属性文件处理存在一些已知问题,但我们认为此时修复它们风险太大。与此相关的是,1.5.x 将于 8 月停产,因此您应该考虑升级(如果可能)。

9

@philwebb 感谢您回复这个非常老的问题。 :)

在哪里可以看到不同 Spring 版本的 EOL?您提到的绝对是我的团队需要研究的内容,我想链接到官方页面并向我的经理提出 EOL 问题。

8

@kapad 公告通常在 spring.io/blog 上发布。 Spring 框架也有一个wiki 页面。我们有一个未解决的问题,可以让这些信息更容易找到。

5

嘿@philwebb

所以我正在检查 spring-boot 2.0.x 的依赖项,发现所需的 spring 核心版本是 5.0.x 现在,我的组织正在使用 spring-boot 1.5.6,正如您在之前的评论中提到的那样, spring boot 版本将于 2019 年 8 月 1 日达到 EOL。尽管如此,spring-boot 1.5.6 依赖于 spring-core 4.3.10(请参阅),它将继续维护到 2020 年中期(来自您共享的wiki )较早)。所以我的问题是 -> 我应该升级到哪个版本的 spring boot,以便我继续依赖 4.3.10 LTS 版本的 spring-core (和其他框架依赖项),并继续使用官方发布的 spring boot 版本支持的?

1

8 月 1 日之后,将不再有依赖于 Spring Framework 4.3.x 的 Spring Boot 受支持版本。如果您想继续使用受支持的 Spring Boot 版本,则应升级到 2.1.x。