Gradle多项目中如何让Spring Boot Devtools重载子项目代码?
解决Spring Boot DevTools无法重载Gradle子项目变更的问题
1. 确保子项目依赖为项目级动态依赖
在buildSrc的dueuno-application.gradle插件中,将主项目(app-test)对其他子项目的依赖声明为项目依赖,而非预构建的jar依赖:
// dueuno-application.gradle中配置主项目依赖 dependencies { implementation project(':elements-core') implementation project(':commons-utils') // 其他业务依赖... }
这种配置让Gradle直接使用子项目的实时编译输出,而非打包后的静态jar,确保代码变更能及时同步到主项目的classpath。
2. 配置BootRun任务关联子项目编译
修改dueuno-application.gradle中的bootRun任务,让它依赖子项目的编译任务,同时将子项目的输出目录加入主项目classpath:
bootRun { // 关联子项目的编译任务,代码变更时自动触发编译 dependsOn ':elements-core:classes', ':commons-utils:classes' // 将子项目的编译输出目录加入主项目运行时classpath classpath += files(project(':elements-core').sourceSets.main.output.classesDirs) classpath += files(project(':commons-utils').sourceSets.main.output.classesDirs) // 开启Gradle连续构建,自动检测子项目变更 continuous true }
3. 扩展DevTools的监控路径
在主项目的application.yml(或application.properties)中,配置DevTools监控子项目的源码和编译输出目录,确保变更被及时检测:
# application.yml spring: devtools: restart: # 添加子项目的源码与编译输出目录到监控列表 additional-paths: - "../elements-core/src/main/java" - "../elements-core/src/main/groovy" - "../commons-utils/src/main/java" - "../commons-utils/build/classes/java/main" - "../commons-utils/build/classes/groovy/main" # 排除无需监控的目录,减少不必要的重启 exclude: "static/**,public/**"
注意路径需根据你的实际项目目录结构调整,确保是相对于主项目配置文件的正确相对路径。
4. IDE自动编译配置(可选但推荐)
如果使用IDE开发(如IntelliJ IDEA),开启自动编译功能加速变更同步:
- 打开
Settings → Build, Execution, Deployment → Compiler,勾选Build project automatically - 按
Ctrl+Shift+A(Windows/Linux)或Cmd+Shift+A(Mac)搜索Registry,找到compiler.automake.allow.when.app.running并勾选
修改子项目代码时,IDE会自动触发Gradle编译,DevTools就能检测到变更并重启应用。
5. 验证配置
执行./gradlew :app-test:bootRun启动应用,修改elements-core或commons-utils中的代码:
- 观察控制台是否触发子项目编译
- 确认DevTools是否自动重启应用
- 验证代码变更是否生效
内容的提问来源于stack exchange,提问作者Gianluca Sartori
相关产品推荐
相关产品推荐

