欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot(20)——devtools介绍

程序员文章站 2022-05-09 17:17:58
...

Spring Boot devtools介绍

Spring Boot提供了一个spring-boot-devtools jar包,提供了一些方便程序开发的功能,主要是监控程序的变化,然后进行自动重新启动。使用spring-boot-devtools需要在pom.xml中添加如下依赖项,同时需要设置<optional>true</optional>spring-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