Spring Boot多模块如何创建独立的application.properties配置文件?
Spring Boot多模块项目独立配置文件不生效问题解决
问题原因
Spring Boot启动时会自动加载所有classpath下的application.properties文件,当不同模块存在相同配置键时,启动模块(application模块)的配置会覆盖依赖模块(config-management模块)的配置——因为启动模块的配置文件加载优先级高于依赖jar中的配置文件。
解决方案
方案1:为模块配置文件重命名并通过spring.config.import导入
这种方式可以保留独立配置文件,同时避免默认加载时的覆盖问题:
- 将
config-management模块下的所有环境配置文件重命名,比如:application.properties→application-config.propertiesapplication-dev.properties→application-config-dev.properties
以此类推,保持每个模块的配置文件名唯一。
- 在主模块(application)的
application.properties中添加导入配置:
若希望config模块的配置优先级高于主模块,可添加# 导入config模块的基础配置 spring.config.import=classpath:application-config.properties # 如果需要根据环境导入对应配置,可以结合激活的profile spring.config.import=classpath:application-config-${spring.profiles.active}.propertiesoverride=true参数(Spring Boot 2.4+支持):spring.config.import=classpath:application-config.properties?override=true
方案2:使用@ConfigurationProperties隔离模块配置
这是更规范的多模块配置方式,通过前缀隔离不同模块的配置,彻底避免键冲突:
- 修改
config-management模块的application.properties,添加专属前缀:config.management.hello=hello-from-config - 在
config-management模块中创建配置类:@Configuration @ConfigurationProperties(prefix = "config.management") @Data // 需要引入lombok依赖,或者手动添加getter/setter public class ConfigManagementProperties { private String hello; } - 修改
TestController,注入专属配置类而非直接使用@Value:
这种方式下,每个模块的配置通过前缀独立隔离,不会被其他模块的配置覆盖。@RestController public class TestController { private final ConfigManagementProperties configProps; // 构造方法注入(推荐) public TestController(ConfigManagementProperties configProps) { this.configProps = configProps; } @GetMapping("hello") public String get() { return configProps.getHello(); } }
方案3:调整配置加载优先级(不推荐)
通过Gradle构建脚本调整依赖模块配置文件的加载顺序,但这种方式容易引发后续配置维护混乱,仅作为临时解决方案:
在application模块的build.gradle中添加:
tasks.withType(JavaCompile) { options.compilerArgs += ['-Dspring.config.location=classpath:/,classpath:/config/'] }
不过这种方式无法精准控制模块间的优先级,不建议长期使用。
内容的提问来源于stack exchange,提问作者Sanjay Prajapat
相关产品推荐
相关产品推荐

