SpringBoot devtools

Spring Boot中提供了一组开发工具spring-boot-devtools,可以提高开发者的工作效率,开发者可以将该模块包含在任何项目中,spring-boot-devtools最方便的地方莫过于热部署了。

 

添加相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>true</scope>
</dependency>

这里多了一个optional选项,是为了防止将devtools依赖传递到其他模块中。当开发者将应用打包运行后,devtools会被自动禁用。

当开发者将spring-boot-devtools引入项目后,只要classpath路径下的文件发生了变化,项目就会自动重启。

如果开发者使用了IntelliJ IDEA,默认情况下,需要开发者手动编译才会触发重启。手动编译时,单击Build→Build Project菜单或者按Ctrl+F9快捷键进行编译,编译成功后就会触发项目重启。当然,使用IntelliJ IDEA的开发者也可以配置项目自动编译

 

基本原理:

Spring Boot中使用的自动重启技术涉及两个类加载器,

一个是baseclassloader,用来加载不会变化的类,例如项目引用的第三方的jar;

另一个是restartclassloader,用来加载开发者自己写的会变化的类。

当项目需要重启时,restartclassloader将被一个新创建的类加载器代替,而baseclassloader则继续使用原来的,这种启动方式要比冷启动快很多,因为baseclassloader已经存在并且已经加载好。

 

自定义监控资源:

从默认的不触发重启的目录中除去:

默认情况下,/META-INF/maven、/META-INF/resources、/resources、/static、/public以及/templates位置下资源的变化并不会触发重启,如果开发者想要对这些位置进行重定义,在application.properties中添加如下配置即可:

spring.devtools.restart.exclude=static/**

表示从默认的不触发重启的目录中除去static目录,即classpath:static目录下的资源发生变化时也会导致项目重启

 

配置需要监控的目录:

也可以反向配置需要监控的目录,配置方式如下:

spring.devtools.restart.additional-paths=src/main/resources/static

这个配置表示当src/main/resources/static目录下的文件发生变化时,自动重启项目。

 

触发文件:

由于项目的编码过程是一个连续的过程,并不是每修改一行代码就要重启项目,这样不仅浪费电脑性能,而且没有实际意义。鉴于这种情况,开发者也可以考虑使用触发文件,触发文件是一个特殊的文件,当这个文件发生变化时项目就会重启,配置方式如下:

spring.devtools.restart.trigger-file=.trigger-file

在项目resources目录下创建一个名为.trigger-file的文件,此时当开发者修改代码时,默认情况下项目不会重启,需要项目重启时,开发者只需要修改.trigger-file文件即可。但是注意,如果项目没有改变,只是单纯地改变了.trigger-file文件,那么项目不会重启。