SpringBoot配置热部署
热部署
在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊。在Java开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。下面我们就看看对于简单的类修改的热部署怎么实现。
devtools工具包
devtools 会监听 classpath 下的文件变动,并且会立即重启应用
idea配置
(1)Settings-Compiler
开启Build Project automatically
(2)Settings-Advanced Settings
开启
Allow auto-make to start even if developed application is currently running
添加Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
配置不需要热部署的文件
如在application.properties文件中添加spring.devtools.restart.exclude=config/**
,则在config目录下的文件做修改时是不会热部署的。
调整检测文件变化的时间间隔
FileSystemWatcher 的工作原理是轮询具有特定时间间隔的类更改,然后等待预定义的静默期以确保不再有更改。 由于 Spring Boot 完全依赖于 IDE 来编译文件并将其复制到 Spring Boot 可以读取它们的位置,因此您可能会发现,当 devtools 重新启动应用程序时,有时某些更改不会反映出来。 如果经常观察到此类问题,请尝试将 和 参数增加到适合您的开发环境的值:
spring:
devtools:
restart:
enabled: true # 开启自动重启,默认true
quiet-period: 1500ms # 保持 1.5 秒的静默期以确保没有其他类更改,默认是400ms
poll-interval: 3000ms # 每 3 秒轮询一次更改,默认是1s
我的电脑性能比较低,所以时间调整的高一些。IDEA在编译的时候会先删除原class,再把编译后的class放过去,如果这中间被devtools检测到了,应用会重启两次。