sublime text 无法直接触发 devtools 自动重启,因其保存 java 源码后不自动编译,target/classes 不更新,而 devtools 仅监听 classpath 下的编译输出路径(如 target/classes),不监听 src/main/java 源码目录。

Sublime Text 本身不支持 Java 编译和类加载,直接配合 spring-boot-devtools 实现热重启不可行——它既不能触发 target/classes 更新,也无法参与 Spring 的双类加载器机制。
为什么 Sublime Text 无法直接触发 devtools 自动重启
spring-boot-devtools 只监听 classpath 下的文件变更(默认是 target/classes 和 META-INF/resources),而 Sublime Text 保存 .java 文件后不会自动编译成 .class,也不会更新这些目录。DevTools 根本“看不见”你的修改。
- DevTools 不监听源码目录(如
src/main/java),只认编译输出路径 - Sublime Text 没有内置 Java 构建系统,
Ctrl+S只是保存文本,不触发javac或 Maven 编译 - 即使你手动运行
mvn compile,若未启用fork或未正确配置插件,spring-boot-maven-plugin也不会在运行时感知变更
可行的最小闭环:Sublime Text + 命令行构建 + DevTools
绕过 IDE 编译集成,用 Sublime Text 写代码,靠外部工具链把变更送进 target/classes,再由 DevTools 捕获。
- 确保
pom.xml中已声明spring-boot-devtools且<optional>true</optional>,同时spring-boot-maven-plugin启用<fork>true</fork> - 在 Sublime Text 中安装
Build System插件(如JavaC或自定义mvn compile):菜单 Tools → Build System → New Build System,填入:
{
"shell_cmd": "mvn compile -q",
"file_regex": "^(...*?):([0-9]+):([0-9]+):\s*(.*)$",
"working_dir": "$project_path",
"selector": "source.java"
}
- 保存为
JavaMvnCompile.sublime-build,然后按Ctrl+B即可编译 —— 这会更新target/classes,触发 DevTools 重启 - 启动应用时必须用
mvn spring-boot:run(而非java -jar),否则 DevTools 自动禁用
静态资源热刷新要额外处理
Sublime Text 修改 templates/ 或 static/ 下的 HTML/CSS/JS,默认也会触发重启,但体验卡顿。建议显式排除:
- 在
application.properties中加:spring.devtools.restart.exclude=templates/**,static/** - 改用
spring.devtools.livereload.enabled=true+ 浏览器 LiveReload 插件,避免重启整个上下文 - 注意:LiveReload 需搭配
spring-boot-devtools的内置 server(默认端口35729),不要被防火墙拦截
容易忽略的关键点
很多人卡在“改了代码没反应”,其实问题不在 Sublime Text,而在构建路径与类加载边界上:
-
mvn compile输出的 class 必须落在 DevTools 监控的 classpath 路径里(通常是target/classes),不是out/production或其他自定义路径 - 如果项目用了多模块,确保当前模块的
target/classes是主应用 classpath 的一部分(检查mvn dependency:tree中是否被正确引入) -
spring.devtools.restart.additional-paths不能指向src/main/java—— 它只用于添加额外的 *编译后资源目录*,比如你把生成的 JSON Schema 放在src/main/resources/schema,才需要加这个配置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











