多模块Spring Boot应用Gradle热重载异常问题求助
解决Gradle多模块Spring Boot热重载失效问题
问题根源
Gradle默认运行Spring Boot应用时,会将依赖的子模块打包成Jar包加入类路径,但Spring Boot DevTools仅会监控未打包的编译输出目录(如build/classes)的文件变化。而Maven直接将子模块的target/classes目录加入类路径,所以修改lib模块代码后能正常触发热重载。
解决方案
1. 调整api模块的依赖配置,引入lib模块的编译输出而非Jar包
在api模块的build.gradle.kts(或Groovy版build.gradle)中,修改对lib模块的依赖,指定依赖其classes变体:
// build.gradle.kts dependencies { // 替换原有project依赖,改用classes变体引入编译输出目录 implementation(project(":lib", "classes")) // 保留其他原有依赖 implementation("org.springframework.boot:spring-boot-starter-web") developmentOnly("org.springframework.boot:spring-boot-devtools") }
2. 确认模块关联配置
在根项目的settings.gradle.kts中,确保已正确包含两个子模块:
// settings.gradle.kts rootProject.name = "gradle-hot-reload" include(":api") include(":lib")
3. 开启IDE自动编译(针对IntelliJ)
- 打开
Settings > Build, Execution, Deployment > Compiler,勾选Build project automatically - 按
Ctrl+Shift+A(Windows/Linux)或Cmd+Shift+A(Mac)搜索Registry,勾选compiler.automake.allow.when.app.running
4. 验证类路径
启动应用后,查看运行日志中的类路径信息,确认已包含lib/build/classes/kotlin/main而非lib/build/libs/lib.jar。
原理说明
通过依赖lib模块的classes变体,Gradle会直接将lib的编译输出目录加入api的类路径,Spring Boot DevTools就能监控到该目录下的代码变更,从而触发应用热重载。
内容的提问来源于stack exchange,提问作者Perry Olsson
相关产品推荐
相关产品推荐

