2019 年在 IDEA 配好 Spring Boot DevTools 和自动构建后,热更新仍时好时坏。继续观察发现,自动编译时已经报错:

Compilation failed: internal java compiler error

没有生成新 class,DevTools 自然无法加载这次改动。应先把“保存、编译、输出、重启”分开检查,而不是继续增加热更新开关。

DevTools 监测的是类路径变化

对使用 Spring Boot 依赖管理的 Maven 项目,可以在开发配置中声明:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

它不是编译器。IDEA 构建成功并更新相应类路径文件后,才可能触发重启;静态资源和模板又有不同处理。Boot 2.1.4 DevTools 说明

先手工构建一次

使用 Build Project,查看完整编译输出和 class 更新时间。若手工构建都失败,先处理编译器错误、JDK 和模块配置,不必把问题直接归给 DevTools。

当时工程调整 Java Compiler 的目标版本后会恢复旧值,后来在 Project Structure 的 Modules 及编译设置中对齐 Java 版本,编译与热更新恢复。

这是一次有效改动,但内部编译器错误并非只有版本不一致这一种原因,应保留具体错误和日志。

设置被改回时,回到构建配置

对于 Maven 或 Gradle 工程,重新导入可能按构建脚本生成模块设置。核对项目 SDK、language level、目标字节码、构建工具 JVM 与 toolchain,而不只在 IDE 界面重复修改。

自动构建及“应用运行期间允许构建”的入口随 IDEA 版本变化,旧 Registry 键不应当作所有版本的操作指南。IDEA 构建说明

最后验证新 class 已生成、应用已重启并加载正确输出。DevTools 属于开发工具,不要为了线上热更新把远程开发能力或开发配置直接暴露到生产环境。