Spring Boot开发工具devtools入门教程
Spring Boot开发工具devtools入门教程
在Spring Boot开发调试中,如果每行代码的修改都需要重启再调试,可能会比较费时。Spring Boot团队为此提供了spring-boot-devtools(简称devtools)插件,以提升开发调试效率。本文将详细介绍devtools的配置和使用方法。
热部署和热加载
热部署和热加载是在应用正在运行的时候,自动更新(重新加载或者替换class等)应用的一种能力。
- 热部署:在服务器运行时重新部署项目,它会重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。
- 热加载:在运行时重新加载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->Setting->Build,Execution,Deployment->Compile
勾选:Make project automatically
设置2:
快捷键:ctrl+alt+shift+/
选择:Registry
勾选:compiler.automake.allow.when.app.running
新版本的IDEA可以在File->setting->Advanced Setttings里面的第一个设置:
application.yml配置
spring:
devtools:
restart:
enabled: true #设置开启热部署
additional-paths: src/main/java #重启目录
exclude: WEB-INF/**
thymeleaf:
cache: false #使用Thymeleaf模板引擎,关闭缓存
使用LiveLoad
spring-boot-devtools模块包含嵌入式LiveReload服务器,可以在资源更改时用于触发浏览器刷新。LiveReload浏览器扩展程序支持Chrome,Firefox和Safari,可以从livereload.com免费下载。或者从浏览器插件中心下载,比如firefox。安装完之后,可以通过如下图标管理。如果你不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false。
进一步理解
devtool的原理
devtools使用了两个类加载器ClassLoader,一个ClassLoader加载不会发生更改的类(第三方jar包),另一个ClassLoader(restart ClassLoader)加载会更改的类(自定义的类)。后台启动一个文件监听线程(File Watcher),监测的目录中的文件发生变动时,原来的restart ClassLoader被丢弃,将会重新加载新的restart ClassLoader。因为文件变动后,第三方jar包不再重新加载,只加载自定义的类,加载的类比较少,所以重启比较快。
devtool是否会被打包进Jar
- 默认情况下,不会被打包进JAR。运行打包的应用程序时,开发人员工具会自动禁用。如果你通过 java -jar或者其他特殊的类加载器进行启动时,都会被认为是“生产环境的应用”。
- 如果期望远程调试应用(生产环境勿用,只有在受信任的网络上运行或使用 SSL 进行保护时,才应启用它),devtool也具备远程调试的能力。
devtool为何会默认禁用缓存选项
Spring Boot 支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。此外,Spring MVC 可以在提供静态资源时向响应添加 HTTP 缓存标头。虽然缓存在生产中非常有益,但在开发过程中可能会适得其反,使你无法看到刚刚在应用程序中所做的更改。出于这个原因,spring-boot-devtools 默认禁用缓存选项。
devtool是否可以给所有Springboot应用做全局的配置
可以通过将spring-boot-devtools.yml文件添加到$HOME/.config/spring-boot目录来配置全局 devtools 设置。添加到这些文件的任何属性都适用于你机器上使用 devtools 的所有Spring Boot 应用程序。
如果我不用devtool,还有什么选择
如果不想使用devtool,可以考虑JRebel(它是收费的),或者在IDEA中使用Rebuild(Ctrl + Shift + F9)进行热更,或者使用spring loaded等工具。
示例源码
https://github.com/realpdai/tech-pdai-spring-demos
参考文章
https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools
https://liayun.blog.csdn.net/article/details/116541775