【问题标题】:Running Spring Boot App with Multiple Spring Profiles使用多个 Spring 配置文件运行 Spring Boot 应用程序
【发布时间】:2026-02-08 12:30:01
【问题描述】:

我有一个 Spring Boot 应用程序(在 Docker 中运行,但我认为这无关紧要),我按如下方式启动:

java -Dspring.profiles.active=development,docker -jar /app.jar

我的 Spring Boot development 配置文件包含一个条目:

service.baseurl: http://foo

我的 Spring Boot docker 配置文件包含一个条目:

service.baseurl: http://bar

我对 Spring 配置文件如何工作的理解是,当有多个配置文件时,值是从找到的 LAST 值中提取的(请参阅https://*.com/a/51565684/2117355)。基于此,我希望我的应用程序加载http://bar 作为service.baseurl 的值。这实际上是在我的开发机器上发生的事情。

但是,在我队友的机器上,为service.baseurl 加载的值是http://foo

这是一个真正令人头疼的问题。我队友的机器上是否有某些设置或版本导致她在这里得到不同的结果?

不管怎样,我们都在奔跑:

  • Java JDK 16.0.2
  • Spring Boot 2.5.4
  • Gradle 7.2
  • Docker 20.10.8

【问题讨论】:

    标签: java spring spring-boot spring-profiles


    【解决方案1】:

    如果我没记错的话,弹簧加载的主文件是application.yaml,您可以在其他配置文件中覆盖此文件中的值,但其他配置文件不能覆盖在另一个配置文件中声明的值。

    在您的情况下,您可以在application.yaml 中声明所有开发配置,并在application-docker.yaml 中覆盖特定属性。然后,当您想在 docker 中运行服务时,只需设置 docker 配置文件即可。

    【讨论】:

      【解决方案2】:

      问题解决了。出于开发目的,此项目的开发人员创建自己的 application-development.properties 文件,这些文件未提交给 Git。我假设每个人都在src/main/resources 下创建这个文件。但是遇到不同行为的开发者已经把这个文件放在了项目的根目录下。这会导致 Spring 以不同的方式加载属性(这会导致在启动时只获取一个配置文件。

      小心放置属性文件的位置。

      【讨论】:

        最近更新 更多