SpringBoot实现热部署

SpringBoot实现热部署主要依赖的是DevTools工具,IDEA可以在新建SpringBoot项目时勾选DevTools选项:



或者手动在pom.xml中添加DevTools依赖的相关jar:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<!--optional=true 依赖不会传递,该项目依赖devtools
	之后依赖该项目的项目如果想要使用devtools,需要重新导入-->
	<optional>true</optional>
</dependency>

这里需要解释一下下,<optional>true</optional>在这里指的是该项配置不会传递,即该项目依赖了DevTools,之后的项目如果依赖了该项目的话,需要重新引用DevTools。看到一些文章中说没有该项的话热部署不会生效,但是我这里如果注掉的话也会生效,暂时还不太清楚什么原因。欢迎各位大佬帮我解答一下这两个疑惑。


完成了这些之后,在SpringBoot项目中其实已经实现了热部署,即修改Java代码后项目会自动重新启动,最明显的额效果就是控制台会打印项目重启的log。其实现在也已经实现了页面的热部署,即修改jsp、js等文件后不需要重启项目,也会立即生效。


还有很重要的一点,如果你使用的是IDEA,需要做一个很重要的配置,否则热部署是不会生效的(这也是之前困扰我很久的一个问题,翻遍了配置文件找不到哪里有错)。

IDEA的话默认是不会去帮你自动编译的

打开Settings,选择Compiler


这个勾需要打上,开启自动编译


Ctrl+Shift+Alt+/,选择Registry


compiler.automake.allow.when.app.running后面的勾也需要打上



至此,IDEA中SpringBoot集成DevTools实现热部署也实现了。

这里大概说一下我对DevTools实现热部署的理解。DevTools会监听classpath下的文件变动,并且会在保存文件时立即重启应用。因为采用的是虚拟机机制,所以重启很快。其实类加载器有base classloader和restart classloader,前者加载不改变的class,例如第三方的jar包,后者主要加载正在开发的class。之所以重启很快,是因为重启的时候只是加载了在开发的class,没有重新加载第三方的jar包。



猜你喜欢

转载自blog.csdn.net/hz_940611/article/details/80594788