一、Java类
使用spring-boot-devtools的应用程序将在类路径上的文件发生更改时自动重新启动。
在pom.xml文件中加入一下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency></pre>
这里多了一个optional,为true表示项目在打包的时候不会被打包进项目中。
此时,只要classpath下的文件发生了变化,项目就会自动重启,这极大的提高了项目的开发速度
要是项目自动编译,idea还需做一些简单的配置,打开Settings——Compiler。

然后按住CTRL+SHIFT+ALT+/,调出如下页面:选择第一个

然后找到如下,并勾选:

重启IDEA,这是你就可以使用devtools来自动构建项目了。
二、静态资源
devtools 中默认嵌入了 LiveReload 服务器,利用 LiveReload 可以实现静态文件的热部署,LiveReload 可以在资源发生变化时自动触发浏览器更新,LiveReload 支持 Chrome、Firefox 以及 Safari 。
需要先在浏览器中安装LiveReload插件,安装过程自行百度,安装好之后:
然后在pom.xml中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
配合thymeleaf和livereload随时加载静态资源和自动刷新页面,首先要在开发时禁用掉缓存cache,同时将livereload设为可用。
在application.properties使用如下配置:
spring.thymeleaf.cache=false
spring.devtools.livereload.enabled=true
或者在application.yml中配置为:
spring:
# thymeleaf
thymeleaf:
# 关闭缓存
cache: false
devtools:
livereload:
enabled: true
然后启动项目,需要观察控制台是否输出LiveReload服务启动成功:
输出 Unable to start LiveReload server,表示启动失败,主要是LiveReload服务端口35729被占用,关闭即可。
输出 LiveReload sever is running on port 35729,则表示启动成功。

测试的话随便打开一个html页面,然后点击浏览器右上角的 LiveReload 按钮,打开 LiveReload 连接。这时修改html中的内容后浏览器就会自动刷新,不需要手动保存然后刷新,而整个项目并没有重启。
三、备注
1. 原理
SpringBoot中提供了热部署插件spring-boot-devtools来提高开发效率,他的原理其实就是两个类加载器:
base classloader:用来加载那些不会变化的类,例如各种第三方依赖;
restart classloader:用来加载那些会发生变化的类,例如你自己写的代码
Spring Boot 中热部署的原理就是当代码发生变化时,base classloader 不变,而 restart classloader 则会被废弃,被另一个新的 restart classloader 代替。在整个过程中,因为只重新加载了变化的类,所以启动速度要比重启快。
注意:如果是编辑器是intellij IDEA,需要配置为自动重建:
在On Update action中选择Update trigger file,在调用Update操作时触发DevTools的Restart;甚至可以选择尝试热插拔的选项,并仅在热插拔失败时使用DevTools重新启动。在On frame deactivation中选择Update classes and resources,在IDEA窗口失去焦点时重新加载所有静态资源和模板(例如,切换到浏览器窗口时):
确认后,修改源码,切换到浏览器,刷新浏览器,可以看到更新后的结果,如果还不行按(Ctrl + F10)强行更新重启。
2. LiveReload注意事项
LiveReload 是和浏览器选项卡绑定在一起的,在哪个选项卡中打开了 LiveReload,就在哪个选项卡中访问页面,这样才有效果。
如果安装并且启动了 LiveReload 插件,同时也添加了 devtools 依赖,但是却并不想当静态页面发生变化时浏览器自动刷新,那么可以关闭插件连接,或者在 application.properties 中添加如下代码进行配置:
spring.devtools.livereload.enabled=false
建议开发者使用 LiveReload 策略而不是项目重启策略来实现静态资源的动态加载,因为项目重启所耗费时间一般来说要超过使用LiveReload 所耗费的时间。
Spring Boot DevTools的用法仅用于开发,而不用于生产。如果应用程序检测到生产中运行,则会自动禁用DevTools。部署时有两种模式:fully packaged artifact完全打包和exploded artifact ;采取前者打包方式Spring会认为是生产应用;后者认为是开发模式,在Idea等IDE中采取的是后者。
使用DevTools的Spring应用程序会自动启动LiveReload服务器。不幸的是,此服务器中只有一个实例可以同时运行。更确切地说,只有第一个可行。
DevTools通常应该正常运行,但它可能与第三方库有冲突。已知的是使用标准ObjectInputStream进行反序列化时可能存在冲突。如果发生此类冲突,可以通过设置禁用自动重启:
spring.devtools.restart.enabled=false
但是,仍将使用重新启动类加载器restart classloader。如果需要完全禁用类加载器,则需要在启动应用程序之前执行此操作:
public static void main(String args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
参考文章:
Spring/SpringBoot系列之SpringBoot使用spring-boot-devtools实现后端热部署、前端自动刷新(热部署)【十七】:https://blog.csdn.net/fei1234456/article/details/106853339