Grails 5.x类热重载异常:修改类触发全应用重启而非局部重载
Grails 5.x 热重载触发全量重启问题排查与解决
核心差异说明
Grails 5.x 基于 Spring Boot 2.x,默认采用 Spring Boot DevTools 实现热重载;而 Grails 3.x 使用的是框架自研的类重载机制,这是两者行为差异的核心原因。DevTools 在检测到类路径变化时,默认会触发应用全量重启而非局部热重载,尤其是修改核心类(比如 Spring Security 相关配置类)时,更容易触发重启。
排查与修复步骤
1. 检查 IntelliJ 配置
- 启用 Build Project Automatically(路径:Settings -> Build, Execution, Deployment -> Compiler)
- 勾选 Allow auto-make to start even if developed application is currently running 选项
- 确认 Grails 运行配置中,On 'Update' action 和 On frame deactivation 均设置为 Update classes and resources
2. 优化 Spring Boot DevTools 配置
在项目的 build.gradle 中添加或调整 DevTools 参数,限定触发重启的范围:
developmentOnly("org.springframework.boot:spring-boot-devtools") bootRun { jvmArgs = [ "-Dspring.devtools.restart.enabled=true", "-Dspring.devtools.restart.additional-exclude=static/**,public/**", "-Dspring.devtools.restart.exclude=views/**" ] }
注意:
exclude参数需根据项目实际调整,不要排除需要重载的 Java/Groovy 类文件。若修改的是核心配置类(如 Spring Security 配置类),DevTools 仍会触发重启,这类修改本身就需要重启才能生效。
3. 验证 Grails 原生重载能力
尝试用 Grails 命令行启动应用(而非通过 IntelliJ 直接启动):
grails run-app
修改类后执行 grails compile,观察是否仅重载修改的类。如果命令行下行为正常,说明问题出在 IntelliJ 配置或 IDE 与 DevTools 的兼容性上。
4. 排查插件兼容性
检查 Spring Security 等插件的版本是否与 Grails 5.x 兼容,部分旧版本插件可能干扰 DevTools 的重载逻辑,确保所有插件使用 Grails 5.x 对应的最新兼容版本。
内容的提问来源于stack exchange,提问作者NiBE
相关产品推荐
相关产品推荐

