1、devtools简介
Spring Boot 提供了一组开发工具 spring-boot-devtools 可以提高开发者的工作效率,开发者可以将该模块包含在任何项目中,spring-boot-devtools 最方便的地方莫过于热部署了。
2、devtools 实战
2.1 基本用法
要想在项目中加入 devtools 模块,只需添加相关依赖即可,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
1
2
3
4
5
注意:这里多了 一个 optional 选项,是为了防止将 devtools 依赖传递到其他模块中。当开发者将应用打包运行后,devtools 会被自动禁用
当开发者将 spring-boot-devtools 引入项目后,只要 classpath 路径下发生变化,项目就会自动重启,这极大地提高了项目的开发速度。如果开发者使用 Eclipse ,那么在修改完代码并保存之后,项目将自动编译井触发重启,而开发者如果使用 IntelliJ IDEA 默认情况下,需要开发者手动编译才会触发重启。手动编译时,单击 Build -> Build Project 菜单或者按 Ctrl+F9 快捷键进行编译,编译成功后就会触发项目重启。当然,使用 IntelliJ IDEA 开发者也可以配置项目自动编译,配置步骤:
单击 File -> settings 菜单,打开 settings 页面,在左边的菜单栏依次找到 Build,Execution,Deployment -> Compile,勾选 Build project automatically 如图所示。
按住Ctrl+Shift+Alt+/ 快捷捷键调出 Maintenance 页面
选择 Registry,在新打开的 Registry 页面中,勾选compiler.automake.allow.when.app.running 复选框。配置完成后,若开发者修改了代码则将会自动重启。
注意:classpath 路径下的静态资源或者视图模板等发生变化时,并不会导致项目重启。
2.2 基本原理
Spring Boot 使用的自动重启技术涉及两个类加载器, 一个是 baseclassloader ,用来加载不会变化的类,例如项目引用的第三方的 jar ;另一个是 restartclassloader ,用来加载开发者自己写的
会变化的类。当项目需要重启时, restartclassloader 将被一个新创建的类加载器代替,而 baseclassloader
则继续使用原来的,这种启动方式要比冷启动快很多,因为 baseclassloader 已经存在井且已经加载好。
2.3 自定义监控资源
默认情况下,/META-INF/maven、/MET A-INF/resources、/resources、/static 、/public 以及 /templates位置下资源的变化并不会触发重启,如果开发者想要对这些位置进行重定义 ,在 application.properties 中添加如下配置即可:
spring.devtools.restart.exclude=static/**
1
这表示从默认的不触发重启的目录中除去 static 目录,即 classpat:static 目录下的资源发生变化时也会导致项目 重启。用户也可以反向配置需要监控的目录,配置方式如下:
spring.devtools.restart.additional-exclude=src/main/resources/static
1
这个配置表示当 src/main/resources/static 目录下的文件发生变化时,自动重启项目。
由于项目的编码过程是一个连续的过程,并不是每修改一行代码就要重启项目,这样不仅浪费电脑性能,而且没有实际意义。鉴于这种情况,开发者也可以考虑使用触发文件,触发文件是个特殊的文件,当这个文件发生变化时项目就会重启,配置方式如下:
spring.devtools.restart.trigger-file=.trigger-file
1
在项目 resources 目录下新建一个名为.trigger-file 的文件,此时当开发者修改代码时,默认情况下项目不会重启,需要项目重启时,开发者只需要修改 .trigger-file 文件即可,但是注意,如果项目没有改变,只是单纯地改变了 .trigger-file 文件,那么项目不会重启。
2.4 使用 LiveReload
因为静态资源目录下的文件变化以及模板文件的变化不会引发重启,虽然开发者可以通过修改配置改变这一默认情况,但实际上并没有必要,因为静态文件不是 class。devtools 默认嵌入了 LiveReoad 服务器,可以解决静态文件的热部署, LiveReload 可以在资源发生变化动触发浏览器更新,LiveReoad 支持 Chrome、Firefox、Safari,以Chrome 为例, 在 Chrome 应用商店搜索 LiveReload 并添加到扩展程序。
在浏览器中打开项目的页面,然后单击浏览器右上角的 LiveReload 按钮,开启LiveReload 连接,此时当静态资源发生改变时,浏览器就会自动加载。如果开发者不想使用这一特性,可通过如下配置关闭:
spring.devtools.livereload.enabled=false
1
注意:建议开发者使 LiveReload 策略而不是项目重启策略来实现静态资源的动态加载,因为项目重启所耗费的时间一般要超过 LiveReload
2.5 禁用自动重启
如果开发者添加了 spring-boot-devtools 依赖但是不想使用自动重启特性,那么可以关闭自动重启。
spring.devtools.restart.enabled=false
1
也可以使用代码来控制:
@SpringBootApplication
public class DevToolsApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(DevToolsApplication.class, args);
}
}