使用热部署,可以让我们在项目中修改完代码后,就能自动执行编译并重启(比停掉服务重启要快的多)。
在需要热部署的项目中引入DevTools依赖(默认静态资源修改是不会重启)即可,或者在全局父Maven模块中引入,或者可以单模块引入然后设置防止其依赖传递。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<!-- 防止将 devtools传递到其他模块中 -->
<optional>true</optional>
</dependency>
一、实现方式
这里使用 IDEA,创建一个 SpringBoot项目。引入DevTools依赖即可使用热部署,使用方式如下:
方式一:
直接启动项目,会看到有个这个“锤子” 图标。 我们修改完代码,然后点击它,即可重启。
方式二:自定义监控资源目录重启
这里我们可以配置 需要重启的目录。在application配置文件中来设置,有两种方式
1)排除
# 从不触发重启的目录中除去 static下的目录,即static目录下的文件发生变化就会触发重启
spring.devtools.restart.exclude=classpath:/static/**
2)添加
# 将static目录下的文件添加到触发重启的目录中
spring.devtools.restart.additional-paths=src/main/resources/static
配置之后,添加的目录就会实现热部署,还是点击那个 “锤子” 图标。
方式三:手动控制文件来重启项目
自定义一个文件(比如:.trigger-file1),内容无所谓,只要这个文件发生变化,就会实现热部署,还是点击那个 “锤子” 图标。
# 手动控制重启项目,只需要.trigger-file1文件发生变化即可,
spring.devtools.restart.trigger-file=.trigger-file1
方式四:设置代码发生变化即可重启,不需要点击那个 “锤子” 图标。
这里需要设置两个东西。
1、点开菜单 【File】-【Settings】-【Build,Execution,Deployment】-【Compiler】-勾选右侧的【Build project automatically】
2、然后按 Ctrl + Alt + Shift + /, 选择【Registry】点击,然后勾上【compiler.automake.allow.when.app.running】
或者 按下Ctrl+Shift+A,打开搜索,输入【Registry】点击,然后勾上【compiler.automake.allow.when.app.running】
最后重启项目,代码发生变化就自动重启,不需要点击那个 “锤子” 图标。
方式五:禁用热部署
# 禁用devtools
spring.devtools.restart.enabled=false
个人不推荐使用方式四(开发中频繁更改,频繁重启对性能和工作效率不高),推荐方式三。
二、工作原理
工作原理使用了两个类加载器:
- 一个Classloader加载那些不会改变的类(第三方Jar包),称为 Base ClassLoader
- 另一个ClassLoader加载会更改的类,称为 Restart ClassLoader
所以我们有代码更改的时候,原来的Restart ClassLoader 被丢弃,重新创建一个 Restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
源码可以看一下 org.springframework.boot.devtools.autoconfigure.RemoteDevToolsAutoConfiguration配置类。
参考文章:
初探 SpringBoot DevTools 重启应用原理
—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。