IntelliJ IDEA 实现保存即编译需三步协同:1. 开启 Settings → Compiler → Build project automatically;2. 在 Registry 中启用 compiler.automake.allow.when.app.running;3. 校准模块 Output path 与构建路径一致(如 Maven 项目应为 target/classes)。

IntelliJ IDEA 默认不自动编译 Java 项目,必须手动开启 “Build project automatically” 并配合 Registry 中的 compiler.automake.allow.when.app.running 才能真正实现保存即编译(尤其在调试时)。
开启 Build project automatically
这是自动编译的前提开关,但仅开启它还不够——IDEA 默认只在显式触发构建(如 Ctrl+F9)时编译,不会响应文件保存。
- 进入
Settings/Preferences → Build, Execution, Deployment → Compiler,勾选Build project automatically - 该选项本身不生效于运行中项目,仅影响手动构建行为;若未配合 Registry 设置,保存 Java 文件后 class 文件不会更新
- Mac 用户注意:该设置路径为
IntelliJ IDEA → Preferences → Build, Execution, Deployment → Compiler
启用 Registry 中的 automake 开关
真正让 IDEA 在保存、切换焦点或调试中实时编译的关键,是启用隐藏的 Registry 选项。否则 Build project automatically 几乎无感。
- 按下
Ctrl+Shift+A(Win/Linux)或Cmd+Shift+A(Mac),输入Registry...并打开 - 找到并勾选
compiler.automake.allow.when.app.running(名称含 “allow when app running”) - 无需重启 IDEA,立即生效;此时保存
.java文件后几秒内,对应.class就会刷新(可观察out/production/xxx或build/classes目录) - 该选项关闭时,即使在 Debug 模式下修改代码,也需手动
Ctrl+F9才能热更 —— 这是绝大多数人卡住的地方
确认编译输出路径与模块配置一致
自动编译生效了,但 class 文件没出现在预期位置?大概率是模块(Module)的 Output path 和实际构建路径错位,导致 IDE 找不到新 class 去热替换。
立即学习“Java免费学习笔记(深入)”;
- 右键项目根目录 →
Open Module Settings(或F4)→Modules → Sources标签页,检查Output path是否指向正确目录(如 Maven 项目应为target/classes) - 若使用 Maven,确保未勾选
Use module compile output path(该选项会覆盖 Maven 的target路径,导致编译结果被写到out/下,而 Spring Boot 等框架运行时只读target) - Gradle 项目同理:在
Settings → Build, Execution, Deployment → Gradle中确认Build and run using和Run tests using都设为Gradle,而非IntelliJ IDEA
调试时热更新失败的常见原因
即使上述全开,Debug 时修改代码仍提示 “Hot swap failed”,往往不是自动编译问题,而是 JVM 热替换能力限制。
- 仅支持方法体内部修改(如改逻辑、加日志),不支持新增/删除字段、方法签名变更、新增类等 —— 此时 IDEA 会灰掉
Reload changed classes按钮 - 确认运行配置中
On 'Update' action和On frame deactivation都设为Update classes and resources(非Update resources only) - 某些框架(如 Lombok)需额外开启 annotation processor:在
Settings → Build, Execution, Deployment → Compiler → Annotation Processors中勾选Enable annotation processing
自动编译看似开关一开就完事,但真正起效依赖三个独立环节协同:IDE 编译开关 + Registry 隐藏策略 + 模块输出路径对齐。漏掉任意一个,都会表现为“保存了却没编译”或“编译了却没热更”。










