已配置spring-boot-devtools但Spring Boot应用修改后不自动热重载
问题原因
日志中出现LiveReload server is running on port 35729仅代表spring-boot-devtools依赖被成功加载,不代表热重启触发链路配置完成。devtools的自动重启逻辑是监听类路径下编译后的class文件变更,只要class文件没有更新、或者IDE/配置屏蔽了运行时的变更监听,就不会触发重载。
排查解决步骤
按优先级从高到低依次排查:
- 补全IDE运行时自动编译配置
90%以上的该问题都是IDE默认配置导致:- 如果使用IDEA:仅开启"Build project automatically(自动构建项目)"不够,需要打开
Settings -> Advanced Settings,找到Allow auto-make to start even if developed application is currently running(中文选项名:即使正在运行应用程序也允许自动生成),勾选后保存,重启IDE即可。 - 如果使用Eclipse:打开顶部菜单
Project,确认勾选Build Automatically(自动构建),保存文件时会自动触发编译。
- 如果使用IDEA:仅开启"Build project automatically(自动构建项目)"不够,需要打开
- 检查devtools重启开关配置
查看项目的application.yml/application.properties配置文件,确认没有显式配置spring.devtools.restart.enabled=false,该配置默认值为true,被手动关闭后会直接禁用自动重启能力。如果需要自定义监控规则,可以补充如下配置:spring: devtools: restart: enabled: true additional-paths: src/main/java # 监控源码路径变更 exclude: static/**,public/**,templates/** # 静态资源不触发重启,走LiveReload刷新即可 - 确认启动方式正确
devtools会在生产运行模式下自动禁用,不要通过以下方式启动:- 打jar包后执行
java -jar启动 - 开启了Spring Boot生产profile(profile=prod)启动
必须通过IDE的运行/调试按钮直接启动主类,启动日志线程名显示restartedMain才代表devtools的重启类加载器正常初始化。
- 打jar包后执行
- 验证编译链路是否正常
修改Controller代码后,查看项目编译输出目录(Maven项目默认是target/classes,Gradle项目默认是build/classes)下对应Controller的class文件修改时间,如果和你修改java文件的时间差超过5秒,说明IDE自动编译没有触发,可以手动按构建快捷键(IDEA是Ctrl+F9,Eclipse是Ctrl+B)触发一次全量编译,正常情况下此时devtools会立刻触发重启。 - 排查依赖冲突
执行依赖树分析命令mvn dependency:tree,确认项目中没有引入其他热部署类组件(比如JRebel、旧版本SpringLoaded),这类组件会抢占类加载监听逻辑,导致devtools的变更监听失效。
内容的提问来源于stack exchange,提问作者Cassie Nguyen
相关产品推荐
相关产品推荐

