在我们的项目开发过程中,当修改了某些代码后需要本地验证时,需要重启本地服务来进行验证。如果项目比较庞大的话,通常需要很长的时间,这就为我们本地调试带来了很大的阻碍。为了解决这个问题,Spring的开发团队为我们带来了一个插件:spring-boot-devtools,很好的解决了本地调试缓慢的问题。
idea热部署设置
在SpringBoot项目进行热部署测试之前,需要先在项目的pom.xml文件中添加spring-boot-devtools热部署依赖启动器:
<!-- 引入热部署依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
添加好依赖之后,我们还需要设置idea的自动编译才会生效。首先,选择idea工具界面的【File】->【Settings】选项,打开Compiler面板的设置界面:

选择Build下的Compiler选项,在右侧勾选"Build project automatically"选项将项目设置为自动编译,单击【Apply】->【OK】按钮来保存设置。
之后,我们在项目的任意页面中使用组合快捷键"Ctrl+Shift+Alt+/",打开Maintenance选项框,选中并打开Registry页面,具体页面如下:

在列表中找到"compiler.automake.allow.when.app.running",将该选项后的Value值勾选,用于指定idea工具在程序过程中自动编译,最后单击【Close】按钮完成设置。
热部署原理分析
该原理其实很简单,就是我们在编译器上启动项目,然后改动相关的代码,然后编译器自动触发编译调换掉历史的.class文件后,项目检测到有文件变更后会自动重启SpringBoot项目。以下是官网的出发描述:

可以看到,我们引入了插件后,插件会监控我们classpath的资源变化。当classpath有变化后,会触发重启:

这里我们可以看到,该插件重启快速的原理是:这里对类加载采用了两种类加载器。对于第三方jar包采用base-classloader来加载,对于开发人员自己开发的代码则使用restartClassLoader来进行加载。这就使得重启快了很多。因为使用插件只是重启开发人员编写的代码部分。
排除资源
我们项目的某些资源在更改后不一定要触发重新启动。比方说,Thymeleaf模板可以就地编辑。默认情况下,改变资源/META-INF/maven
、/META-INF/resources
、/resources
、/static
、/public
或者/templates
不触发重新启动,但会触发现场重装。如果要自定义这些排除项,则可以使用该spring.devtools.restart.exclude
属性。例如,仅排除/static
、/public
则将设置以下属性:
spring.devtools.restart.exclude=static/**,public/**
文章评论