Spring Boot devtools 介绍

Spring Boot提供了一个spring-boot-devtools jar包,提供了一些方便程序开发的功能,主要是监控程序的变化,然后进行自动重新启动。使用spring-boot-devtools需要在pom.xml中添加如下依赖项,同时需要设置truespring-boot-devtools默认将只在开发环境生效,通过Spring Boot插件打包时默认是不会包含spring-boot-devtools

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

默认情况下,当devtools检测到classpath下有文件内容变更时,它会对当前Spring Boot应用进行重新启动。但它的重新启动并不是完整的重启整个应用。它的应用的重启是基于两个不同的ClassLoader进行的,根ClassLoader将负责加载第三方jar包中的内容,而当前应用中的Class、配置文件等资源则使用一个可重新加载的ClassLoader进行加载,叫RestartClassLoader。当检测到有内容变更时,Spring Boot会弃用原来的RestartClassLoader,然后重新创建一个新的RestartClassLoader来加载当前应用的Class等资源。这种设计可以让程序快速的进行重启,因为这个时候第三方jar包中的资源已经在第一次启动的时候进行加载了,自动重启的时候已经不再加载它了,而且在开发的时候,希望改动后立马生效的通常也是应用中自己定义的Class及其它资源。但如果你期望第三方jar文件的变动也会触发devtools进行自动重启,则可以创建META-INF/spring-devtools.properties,在文件中通过restart.include.xxx指定需要自动重启的jar,通过restart.exclude.xxx指定不需要自动重启的jar,属性值采用正则表达式匹配。所有的属性名必须是唯一的,它们的前缀必须是restart.include.restart.exclude.,至于后面的内容是无所谓的。比如下面的配置就指定了所有的以mycorp-common-打头的jar包不参与自动重启,而所有的以mycorp-myproj-打头的jar包需要参与自动重启。

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

默认情况下,/META-INF/maven, /META-INF/resources, /resources, /static, /public, 和 /templates下面的资源的变化不会触发自动重启。如果用户期望其它资源文件的变更也不会进行自动重启,则可以在application.properties文件中通过spring.devtools.restart.exclude属性进行指定,比如不想在更改application.properties文件的时候进行自动重启,可以进行如下配置。

spring.devtools.restart.exclude=application.properties

如果想监听非Classpath路径下的文件的变更进行自动重启,则可以通过spring.devtools.restart.additional-paths属性进行指定。

如果你想禁用devtools的自动重启功能,则可以指定spring.devtools.restart.enabled=false,也可以在Spring Boot启动的main程序中,在调用SpringApplication.run(..)之前指定系统属性spring.devtools.restart.enabled为false。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(Application.class, args);
    }
}

如果你不想在改变ClassPath路径下的任何文件后立马就进行自动重启,而是希望在更改了很多文件后,在更改了一个特殊的文件后自动触发自动重启,则可以通过spring.devtools.restart.trigger-file属性指定触发自动重启的文件,这样当该文件的内容发生了变更后将会触发自动重启。比如下面的配置就表示当更改了application.properties文件的内容时将触发自动重启。

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

上面的针对devtools的配置都是基于单个项目的配置,如果希望上述配置能够针对所有的项目都生效,则可以在HOME目录下新建一个.spring-boot-devtools.properties文件(注意文件名是以点开头的),在其中定义那些配置属性。

参考文档

https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/using-boot-devtools.html