spring boot遇坑之devtools热启动

  • devtools简介
  • 问题汇总
  • 配置后不生效
  • 添加devtools后项目启动报错
  • 希望可以帮助到你
  • 参考


devtools简介

devtools可以实现spring boot 工程的热启动(即我们修改的代码修改且被编译后,会自动触发重启工程),由于其采用的双类加载器机制,这个启动会非常快。
双类加载器机制:
AppClassLoader:用于加载不会改变的jar(eg.第三方依赖的jar)(遵循双亲委派原则)
RestartClassLoader :用于加载我们正在开发的jar(eg.整个项目里我们自己编写的类)。当应用重启后,原先的RestartClassLoader 被丢掉、重新new一个RestartClassLoader 来加载这些修改过的东西,而bc却不需要动一下。这就是devtools重启速度快的原因。注:第三方jar包也可以通过配置使用该加载器加载

问题汇总

这里记录了些我在使用devtools时遇到的问题,可以供大家参考下。

配置后不生效

配置参考:
pom配置

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 -->
            <!--<scope>true</scope>-->
            <version>1.5.19.RELEASE</version>
        </dependency>
        <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork><!-- 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
                </configuration>
            </plugin>
        </plugins>
    </build>

配置不生效时注意检查以下设置:

1、自动编译

springboot自带类加载器 springboot类加载器冲突_类加载器


2、ctrl+shift+alt+/ 设置 register

springboot自带类加载器 springboot类加载器冲突_加载_02


3、开启自动编译后有些IDE貌似需要按ctrl+s或ctrl+f9才会触发自动编译,编译后才能触发项目重启

添加devtools后项目启动报错

最近从网上度娘了一份spring cloud的代码案例,demo本身不带devtools,启动正常。但是作为懒货无法容忍每次都手动启动项目。所以就尝试引入devtools,并按以上配置好,发现启动项目就报错了。如下图:

springboot自带类加载器 springboot类加载器冲突_springboot自带类加载器_03


分析:

springboot自带类加载器 springboot类加载器冲突_加载_04


我这个baseService是通过依赖应用进来的jar包,采用devtools模式时,因为双类加载器机制会由AppClassLoader类加载器加载,而项目代码采用RestartClassLoader类加载器加载。同级别之前的类加载器加载的类不能相互引用导致bean无法注入。(注:这些都是我的自我分析描述,如有出入请指出)

一顿科普后终于找到解决问题:

方式如下:

添加META-INF/spring-devtools.properties 配置

springboot自带类加载器 springboot类加载器冲突_spring_05


配置内容如下:

将第三方的包也用RestartClassLoader加载

#restart.include.mapper=/mapper-3.4.2.jar //将第三方的包也用RestartClassLoader加载
restart.include.db-spring-boot-autoconfigure=db-spring-boot-autoconfigure-1.0-SNAPSHOT.jar