Spring Boot项目pom.xml正确配置主与测试资源目录的方法
问题根因
这是Spring Boot配置加载优先级和Maven资源配置规则共同导致的问题:
- Spring Boot默认配置加载规则中,
/src/test/resources/路径下的配置优先级高于/src/main/resources/下的同名application.properties。如果两个路径下存在完全同名的配置文件,主路径下的文件会被直接覆盖,不会自动做内容合并,主配置里定义的JMS_URL这类配置项不会被测试上下文读取到,就会抛出无法解析占位符的错误。你删除测试路径下的配置文件后报错消失,本质就是此时测试上下文会直接加载主路径下的完整配置,不存在覆盖问题。 - 你之前在pom.xml中仅配置了主资源目录的过滤规则,没有同步配置测试资源目录,测试阶段Maven不会正常处理测试路径下的配置文件,进一步加剧了配置缺失的问题。
正确处理方案
根据实际需求选以下任意一种方案即可:
- 方案1:使用测试专属profile(最推荐,无冗余配置)
不要在测试资源目录直接放置同名的application.properties,把测试环境专属的配置项单独放在/src/test/resources/application-test.properties文件中,在测试类上添加@ActiveProfiles("test")注解指定测试时启用test profile。
这种方式下Spring Boot会先完整加载主路径下的application.properties所有公共配置,再用test profile中的配置覆盖需要调整的测试专属项,主配置里的公共配置(比如JMS_URL)不需要在测试配置中重复定义,完全匹配你的使用需求。 - 方案2:补全Maven测试资源配置(仅适用于需要完全独立测试配置的场景)
如果一定要在测试路径下保留同名application.properties,需要在pom.xml中补全<testResources>配置块,同时配置主资源和测试资源的过滤规则,参考配置如下:
注意:即使配置了上述规则,测试路径下的<build> <!-- 主资源目录配置 --> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> </includes> </resource> </resources> <!-- 补全测试资源目录配置 --> <testResources> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> </includes> </testResource> </testResources> </build>application.properties依然会完全覆盖主路径的同名文件,你必须把所有占位符依赖的配置项在测试配置中完整补全,否则还是会报占位符解析错误,配置冗余度较高。 - 方案3:指定测试配置加载规则实现配置合并
如果既要保留测试路径下的同名配置、又不想重复编写公共配置,可以在测试类上通过@TestPropertySource注解显式指定配置加载顺序,实现主配置与测试配置的合并加载:
这种写法下,后加载的配置会覆盖前面加载的同名配置项,不同名的配置项会共存,不需要重复定义公共配置。@SpringBootTest @TestPropertySource(locations = { "classpath:application.properties", "classpath:application-test.properties" }) public class BaseApplicationTests { // 测试逻辑 }
踩坑提醒:Maven资源插件仅负责把配置文件拷贝到运行时classpath,同路径下的同名文件只会保留优先级更高的那一份,不要试图通过修改Maven资源配置实现两个同名
application.properties的自动合并,配置合并逻辑是Spring Boot层面处理的,和Maven无关。
内容的提问来源于stack exchange,提问作者heisenberg
相关产品推荐
相关产品推荐

