SpringBoot提供了一组开发工具Spring-boot-devtools,可以提高开发者的工作效率,开发者可以将该模块包含在任意项目中,最方便的功能莫过于热部署了
基本用法
用法非常简单,只需要在pom中引入该工具即可,这里多了一个optional选项,是为了防止将devtools依赖传递到其他模块中,当开发者将应用打包运行后,devtools会被自动禁用。
<!-- 热部署模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
如果开发者使用eclipse,那么在修改完代码并保存后,项目将自动编译触发重启。
如果使用的是idea,参考此文章
基本原理
如下图所示,整个项目中引用的类为绿色方块,它由开发者编写的会变化的类和项目中引用的第三方jar组成,冷启动每次重启都会重新加载所有的类。
Springboot是用的自动重启技术涉及到两个类加载器,
- baseclassloader用来加载不会变化的类,也就是引用的三方jar,
- restartclassloader用来加载开发人员编写的类
每当检测到代码变化时,baseclassloader继续使用原来的,但是restartclassloader将被一个新创建的类加载器替代,大大提高了启动速度。
自定义监控资源
默认情况下,/META-INF/maven、/META-INF/resources、/resources、/static、/public和/templates位置下的资源变化不会触发重启,如果希望改变这些默认配置,可以在application.properties文件中设置
spring.devtools.restart.exclude=static/**
这表示从默认的不触发目录中移除static目录
spring.devtools.restart.additional-paths=src/main/resoutces/static
这表示当src/main/resoutces/static目录下文件发生变化时,会自动重启项目
使用触发文件配置热部署
由于项目编写是一个持续的过程,并不需要没修改一行代码就触发热重启,这样不仅浪费电脑性能,没有实际意义,因此,可以设置一个触发文件,通过修改文件来触发项目热重启,这样修改代码就不会频繁重启。
-
在application.properties文件中设置
spring.devtools.restart.trigger-file=restart.trigger-file
-
在resources目录下创建一个restart.trigger-file文件。
配置完成后,再修改代码也不会触发自动重启,但是当修改resources目录下restart.trigger-file文件后,项目就会重启一次。
需要注意的是,如果项目中文件没有变动,单纯的修改restart.trigger-file文件不会触发热重启
禁用自动重启
在application.properties文件中设置
spring.devtools.restart.enabled=false