Spring Boot多模块应用中如何读取子模块的application.properties?
针对你用Gradle buildSrc构建的多模块项目,要让主Spring Boot应用读取子模块的application.properties,可以用以下几种方法:
方法1:让主模块依赖子模块(最推荐)
Spring Boot默认会扫描classpath下所有依赖模块的src/main/resources目录,只要主模块依赖子模块,子模块的配置文件会自动被加载。
在主模块的build.gradle(或build.gradle.kts)中添加依赖:
// Groovy 语法 dependencies { implementation project(':subproject') // 其他业务依赖... }
// Kotlin DSL 语法 dependencies { implementation(project(":subproject")) // 其他业务依赖... }
如果子模块是普通Java库(非Spring Boot模块)也完全适用,只要被主模块依赖,它的配置文件就会被纳入classpath扫描范围。
方法2:手动将子模块资源目录加入主模块classpath
如果不想依赖整个子模块,只想加载其配置文件,可以通过Gradle配置,将子模块的资源目录添加到主模块的资源源目录中:
// Groovy 语法 sourceSets { main { resources { srcDirs += project(':subproject').sourceSets.main.resources.srcDirs } } }
// Kotlin DSL 语法 sourceSets { main { resources { srcDirs.add(project(":subproject").sourceSets.main.get().resources.srcDirs) } } }
这样构建时,子模块的application.properties会被当作主模块的资源文件处理,自然会被Spring Boot读取。
方法3:通过Spring配置导入指定文件
如果子模块的配置文件名和主模块重复,或者需要更灵活的加载控制,可以在主模块的application.properties中显式导入子模块的配置:
# 主模块application.properties # 导入子模块的配置文件 spring.config.import=classpath:/application.properties
注意:如果主模块和子模块有同名配置项,子模块的配置会覆盖主模块的(Spring Boot按classpath加载顺序,后加载的覆盖先加载的)。如果要避免覆盖,建议给子模块的配置文件改名(比如
application-subproject.properties),然后导入:spring.config.import=classpath:/application-subproject.properties
配合buildSrc的优化
如果你的项目有多个子模块需要统一处理,可以在buildSrc中编写自定义Gradle插件,将上述依赖或资源目录配置逻辑封装起来,避免重复代码。比如创建一个SpringBootModulePlugin,自动让主模块依赖指定的子模块,或者自动添加子模块的资源目录。
内容的提问来源于stack exchange,提问作者xgrimau

