使用热部署,可以让我们在项目中修改完代码后,就能自动执行编译并重启(比停掉服务重启要快的多)。

 

在需要热部署的项目中引入DevTools依赖(默认静态资源修改是不会重启)即可,或者在全局父Maven模块中引入,或者可以单模块引入然后设置防止其依赖传递。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <!--  防止将 devtools传递到其他模块中 -->
            <optional>true</optional>
        </dependency>

一、实现方式

这里使用 IDEA,创建一个 SpringBoot项目。引入DevTools依赖即可使用热部署,使用方式如下:

方式一:

直接启动项目,会看到有个这个“锤子” 图标。 我们修改完代码,然后点击它,即可重启。

springboot devtools 如何做到 热部署 springboot热部署插件_重启

方式二:自定义监控资源目录重启

    这里我们可以配置 需要重启的目录。在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】

springboot devtools 如何做到 热部署 springboot热部署插件_重启_02

2、然后按 Ctrl + Alt + Shift + /, 选择【Registry】点击,然后勾上【compiler.automake.allow.when.app.running】

    或者 按下Ctrl+Shift+A,打开搜索,输入【Registry】点击,然后勾上【compiler.automake.allow.when.app.running】

springboot devtools 如何做到 热部署 springboot热部署插件_spring_03

 

springboot devtools 如何做到 热部署 springboot热部署插件_热部署_04

 

最后重启项目,代码发生变化就自动重启,不需要点击那个 “锤子” 图标。

 

方式五:禁用热部署

# 禁用devtools
spring.devtools.restart.enabled=false

个人不推荐使用方式四(开发中频繁更改,频繁重启对性能和工作效率不高),推荐方式三。

  

springboot devtools 如何做到 热部署 springboot热部署插件_使用DevTools热部署_05

 

二、工作原理

工作原理使用了两个类加载器:

  • 一个Classloader加载那些不会改变的类(第三方Jar包),称为 Base ClassLoader
  • 另一个ClassLoader加载会更改的类,称为 Restart ClassLoader

所以我们有代码更改的时候,原来的Restart ClassLoader 被丢弃,重新创建一个 Restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

源码可以看一下 org.springframework.boot.devtools.autoconfigure.RemoteDevToolsAutoConfiguration配置类。

springboot devtools 如何做到 热部署 springboot热部署插件_使用DevTools热部署_06

 

参考文章:

初探 SpringBoot DevTools 重启应用原理

 

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。