【发布时间】:2025-12-14 04:55:02
【问题描述】:
我正在开发一个多模块 Maven 项目,其中每个模块都是一个 Spring Boot 应用程序(即打包为可执行 jar)。一些模块依赖于其他模块。该项目使用 platform-bom 版本 1.1.4.RELEASE。
我发现了我认为决定使用哪些应用程序属性文件的奇怪逻辑 - 尽管与 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 中的信息没有明确相反,但充其量似乎仍然不直观。
这种情况是在以下情况下发现的:
Module A 在其资源文件夹中有一个 application.properties 文件,因此将其打包到 spring boot jar 的根目录下。这个 application.properties 定义了一个标准的 Spring JPA 数据源。
模块 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