Spring Boot 和多个外部配置文件

新手上路,请多包涵

我有多个要从类路径加载的属性文件。在 /src/main/resources 下有一个默认设置,它是 myapp.jar 的一部分。我的 springcontext 希望文件位于类路径中。 IE

 <util:properties id="Job1Props"
    location="classpath:job1.properties"></util:properties>

<util:properties id="Job2Props"
    location="classpath:job2.properties"></util:properties>

我还需要使用外部设置覆盖这些属性的选项。我在 cwd 中有一个外部配置文件夹。根据 spring boot 文档配置文件夹应该在类路径上。但是从文档中不清楚它是否只会覆盖 application.properties 从那里或配置中的所有属性。

当我测试它时,只有 application.properties 被拾取,其余属性仍然从 /src/main/resources 拾取。我已经尝试将它们作为逗号分隔列表提供给 spring.config.location 但默认设置仍未被覆盖。

如何使多个外部配置文件覆盖默认配置文件?

作为解决方法,我目前使用 app.config.location (应用程序特定属性),这是我通过命令行提供的。 IE

 java -jar myapp.jar app.config.location=file:./config

我将 applicationcontext 更改为

/util:properties

 <util:properties id="Job2Props"
    location="{app.config.location}/job2.properties"></util:properties>

这就是我在加载应用程序时分离文件和类路径的方式。

编辑:

 //pseudo code

if (StringUtils.isBlank(app.config.location)) {
            System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}

我真的不想使用上述解决方法,而是让 Spring 覆盖类路径上的所有外部配置文件,就像它对 application.properties 文件所做的那样。

原文由 nir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
1 个回答

更新:由于 spring.config.location 的行为现在覆盖默认值而不是添加到默认值。您需要 使用 spring.config.additional-location 来保留默认值。这是从 1.x 到 2.x 的行为变化


使用 Spring Boot 时,属性按以下顺序加载(请参阅 Spring Boot 参考指南中的 外部化配置)。

  1. 命令行参数。
  2. Java 系统属性 (System.getProperties())。
  3. 操作系统环境变量。
  4. 来自 java:comp/env 的 JNDI 属性
  5. 仅具有随机属性的 RandomValuePropertySource。*。
  6. 打包的 jar 之外的应用程序属性(application.properties 包括 YAML 和配置文件变体)。
  7. 打包在您的 jar 中的应用程序属性(application.properties 包括 YAML 和配置文件变体)。
  8. @Configuration 类上的@PropertySource 注释。
  9. 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

解析属性时(即 @Value("${myprop}") 解析以相反的顺序完成(因此从 9 开始)。

要添加不同的文件,您可以使用 spring.config.location 属性,它采用逗号分隔的属性文件列表或文件位置(目录)。

 -Dspring.config.location=your/config/dir/

上面的将添加一个目录,该目录将被查询 application.properties 文件。

 -Dspring.config.location=classpath:job1.properties,classpath:job2.properties

这会将 2 个属性文件添加到加载的文件中。

默认配置文件和位置在额外指定的 spring.config.location 之前加载,这意味着后者将始终覆盖早期配置中设置的属性。 (另请参阅《Spring Boot 参考指南》的 这一部分)。

如果 spring.config.location 包含目录(而不是文件),它们应该以 / 结尾(并且将在加载之前附加从 spring.config.name 生成的名称)。始终使用默认搜索路径 classpath:,classpath:/config,file:,file:config/ ,无论 spring.config.location 的值如何。通过这种方式,您可以在 application.properties (或您使用 spring.config.name 选择的任何其他基本名称)中为您的应用程序设置默认值,并在运行时使用不同的文件覆盖它,保持默认值。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题