【问题标题】:Strange logic for choosing properties file for spring boot application为 Spring Boot 应用程序选择属性文件的奇怪逻辑
【发布时间】:2025-12-14 04:55:02
【问题描述】:

我正在开发一个多模块 Maven 项目,其中每个模块都是一个 Spring Boot 应用程序(即打包为可执行 jar)。一些模块依赖于其他模块。该项目使用 platform-b​​om 版本 1.1.4.RELEASE。

我发现了我认为决定使用哪些应用程序属性文件的奇怪逻辑 - 尽管与 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 中的信息没有明确相反,但充其量似乎仍然不直观。

这种情况是在以下情况下发现的:

  1. Module A 在其资源文件夹中有一个 application.properties 文件,因此将其打包到 spring boot jar 的根目录下。这个 application.properties 定义了一个标准的 Spring JPA 数据源。

  2. 模块 B 依赖于 A,但其中有自己的 application.yml 属性文件(以及特定于配置文件的 .properties 文件,例如 application-foo.properties)。此文件没有 JPA 数据源的条目,但代码确实需要注入数据源。

出乎意料的是,当 B 的测试在 Maven 构建中运行时,似乎从 A 读取了 application.properties,并用于配置 B 使用的数据源。从上面的链接中,可以推断这是正确的行为( 24.3 中的“类路径根”可以理解为在类路径上的 jar 的根中,A 的 jar 在为 B 运行测试时将是该 jar)。注意 .yml 属性也会被处理。

但是,如果我在 B 的资源中与 .yml 文件一起提供了一个空的 application.properties,那么这似乎在测试期间具有优先权,并且根本不再处理来自 A 的 application.properties。 .yml 文件仍在处理中。

我会从文档中想到应该处理所有符合条件的属性文件,即如果 A 的 application.properties 被读取,那么如果 B 提供自己的文件(以 B 优先),它仍然应该是。似乎 .properties 和 .yml 文件的处理方式也不相同(application.yml 的存在并没有阻止 A 的 application.properties 被读取,但在 B 中有 application.properties 确实如此)。

请有人澄清预期的行为是什么,并评论文档(上面链接)是否正确?特别是:

1) 当文档说明可以从“类路径根”加载属性文件时,是否也应该包括类路径上任何 jar 的根?

2) 在 B 中提供 application.properties 是否应该阻止 A 被发现?

3) .yml 属性是否应该针对这种行为区别对待?

【问题讨论】:

  • 所以只有 B 的 application.properties 被读取。您应该在 A 项目中创建 a.properties。在 A @Configuration 类中,您将使用 @PropertySource("classpath:/a.properties")

标签: spring-boot classpath properties-file


【解决方案1】:

类路径根只是它包含的所有档案中所有文件的平面表示。您可以将其视为解压缩目录中的任何内容然后读取它(物理上它是不同的,但与读取文件时发生的情况相当)。最接近您的文件将在任何其他文件之前被读取。因此,当您提供自己的 application.properties 时,它将覆盖 jar 文件中包含的那些。

所以是的,这将停止读取 jar 中的文件。为什么要想象 20 个罐子都包含一个 application.properties 应该如何保证一个订单,哪个应该赢?特别是如果它们包含重叠的属性。所以只会读取一个。

.properties.yml 是不同的文件,因此都被读取(我什至相信@9​​87654325@ 在.yml 文件之前被读取但不确定)。所以是的,这也是预期的行为。

【讨论】:

    最近更新 更多