SpringBoot 热部署解析

西梁 2020年12月09日 528次浏览

在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊。在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。下面我们就看看对于简单的类修改的热部署怎么实现。

1. 原理
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
2. devtools工具包
devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),java类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。devtools可以实现页面热部署。
3. idea的工具设置
当我们修改了类文件后,idea不会自动编译,需要通过ctrl+F9来触发,如果想要自动生效得修改idea设置,该功能按着个人的喜好来设置,修改类后,当我们窗口切换时候可以看到热部署的发生。
4. 热部署的排除
默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。

  • 我们在resources/static目录下创建tx.js文件每次发生修改后的并不重启,而是采用livereload的方式。
  • 同时我们可以根据自己的意愿来设置想要排除的资源