在SpringBoot开发调试中,如果我每行代码的修改都需要重启启动再调试,可能比较费时间;SpringBoot团队针对此问题提供了spring-boot-devtools(简称devtools)插件,它试图提升开发调试的效率。@pdai
- SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?
-
- 什么是热部署和热加载?
- 配置devtools实现热部署
-
- devtool的原理?为何会自动重启?
- devtool是否会被打包进Jar?
- devtool为何会默认禁用缓存选项?
- devtool是否可以给所有Springboot应用做全局的配置?
- 如果我不用devtool,还有什么选择?
-
准备知识点
什么是热部署和热加载?
热部署和热加载是在应用正在运行的时候,自动更新(重新加载或者替换class等)应用的一种能力。(PS:spring-boot-devtools提供的方案也是要重启的,只是无需手动重启能实现自动加载而已。)
严格意义上,我们需要区分下热部署和热加载, 对于Java项目而言:
-
热部署
- 在服务器运行时重新部署项目
- 它是直接重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。
-
热加载
- 在在运行时重新加载class,从而升级应用。
- 热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。
- 对比反射机制,反射是在运行时获取类信息,通过动态的调用来改变程序行为; 热加载则是在运行时通过重新加载改变类信息,直接改变程序行为。
什么是LiveLoad?
LiveLoad是提供浏览器客户端自动加载更新的工具,分为LiveLoad服务器和Liveload浏览器插件两部分; devtools中已经集成了LiveLoad服务器,所以如果我们开发的是web应用,并且期望浏览器自动刷新, 这时候可以考虑LiveLoad.
同一时间只能运行一个LiveReload服务器。 开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。
配置devtools实现热部署
我们通过如下配置来实现自动重启方式的热部署。
POM配置
添加spring-boot-devtools的依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 可以防止将devtools依赖传递到其他模块中 --> </dependency> </dependencies>
IDEA配置
如果你使用IDEA开发工具,通常有如下两种方式:
- 方式一: 无任何配置时,手动触发重启更新(Ctrl+F9)

(也可以用 mvn compile
编译触发重启更新)
- 方式二: IDEA需开启运行时编译,自动重启更新
设置1:
File-