Spring Boot 3.6热部署失效主因是类加载隔离未生效、IDE未联动编译及静态资源路径不匹配;需在pom.xml添加optional=true的DevTools依赖,IDEA中启用自动编译和运行时编译,并验证RestartClassLoader日志。

Spring Boot 3.6项目中改完Controller或Service代码后仍需手动重启,说明DevTools未真正生效——这不是配置漏了,而是类加载隔离、IDE编译联动、静态资源路径三者没对齐,导致变更根本没被监听到。
添加DevTools依赖并规避生产污染
在pom.xml的<dependencies>内插入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
【optional=true不可省略】它确保Maven打包时不会把DevTools打进fat jar,避免上线后意外启用开发功能引发安全风险或内存泄漏。
Gradle用户请在build.gradle中写入:
dependencies { developmentOnly 'org.springframework.boot:spring-boot-devtools' }
IntelliJ IDEA关键设置:让编译和重启真正联动
DevTools不编译代码,它只响应.class文件变化。IDE不编译,它就永远“看不见”你改了什么。
第一步:打开File → Settings → Build, Execution, Deployment → Compiler → 勾选“Build project automatically”
第二步:按Ctrl+Shift+A(Windows/Linux)或Cmd+Shift+A(Mac),输入Registry → 找到compiler.automake.allow.when.app.running → 勾选启用
这两项缺一不可。只开自动编译但没开“运行时允许编译”,服务启动后改代码依然不会触发编译;只开后者不开启自动编译,IDE根本不会生成新.class文件。
验证自动重启是否就绪
启动应用后,在控制台日志顶部查找类似以下两行:
Using loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader
Started Application in X.XXX seconds (JVM running for Y.YYY)
如果看到RestartClassLoader,说明类加载器已隔离成功;若只显示LaunchedURLClassLoader,说明DevTools未生效——大概率是依赖未正确引入或IDE设置未保存。
此时修改任意一个@Controller类中的返回字符串,保存后观察控制台是否出现“Restarting due to changes…”字样及快速重启日志。没有该提示,说明文件监听链路中断。
静态资源热加载:改完CSS/HTML秒刷即见
方法一:Thymeleaf模板热加载
在application.properties中添加:
spring.thymeleaf.cache=false
spring.devtools.restart.additional-paths=src/main/resources/templates
方法二:纯静态资源(JS/CSS/IMG)热加载
确保文件放在src/main/resources/static目录下,无需额外配置——DevTools默认监听该路径。改完任意.css文件,浏览器Ctrl+R即可生效。
注意:若使用Spring MVC + JSP,DevTools不支持JSP热加载,必须迁移到Thymeleaf或FreeMarker才能享受此能力。
跳过无意义监控,加速重启响应
默认情况下,DevTools会扫描整个src/main/resources,包括logback-spring.xml、application.yml等稳定配置文件。它们极少变动,却拖慢监听效率。
在application.properties中加入:
spring.devtools.restart.exclude=static/**,public/**,config/**
这会让DevTools忽略static、public、config子目录下的所有变更,重启触发更精准——尤其适合含大量配置文件或前端构建产物的混合项目。

















