spring boot遇坑之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、自动编译
2、ctrl+shift+alt+/ 设置 register
3、开启自动编译后有些IDE貌似需要按ctrl+s或ctrl+f9才会触发自动编译,编译后才能触发项目重启
添加devtools后项目启动报错
最近从网上度娘了一份spring cloud的代码案例,demo本身不带devtools,启动正常。但是作为懒货无法容忍每次都手动启动项目。所以就尝试引入devtools,并按以上配置好,发现启动项目就报错了。如下图:
分析:
我这个baseService是通过依赖应用进来的jar包,采用devtools模式时,因为双类加载器机制会由AppClassLoader类加载器加载,而项目代码采用RestartClassLoader类加载器加载。同级别之前的类加载器加载的类不能相互引用导致bean无法注入。(注:这些都是我的自我分析描述,如有出入请指出)
一顿科普后终于找到解决问题:
方式如下:
添加META-INF/spring-devtools.properties 配置
配置内容如下:
将第三方的包也用RestartClassLoader加载
#restart.include.mapper=/mapper-3.4.2.jar //将第三方的包也用RestartClassLoader加载
restart.include.db-spring-boot-autoconfigure=db-spring-boot-autoconfigure-1.0-SNAPSHOT.jar
希望可以帮助到你
参考
https://segmentfault.com/a/1190000009324801
https://www.cnblogs.com/java-zhao/p/5502398.html
https://blog.csdn.net/qq_20745827/article/details/81316968