一文带你认识热部署、附实验结果
本文所诉热部署不包含前端,仅对服务端的一些热部署做些简要说明!
热部署
每次修改代码(以及修改配置文件)都要重启,是不是很烦、讲真你的服务涉及第三方服务过多时、要加载时初始化一些数据的时候,你搞热部署也不见得能省多少时间,但是你可以配置下其他目录exclude!
原理
使用了两个ClassLoader,一个(base ClassLoader)加载不会改变的类(依赖的jar包)、exclude的目录等。另一个restart ClassLoader 加载会更改的文件,这样在有代码更改的时候,原来的 restart ClassLoader 被丢弃,重新创建一个restart ClassLoader。由于需要加载 的类相比较少,所以重启时间更短些,所以重启较快。 简而言之,加载的更少自然重启的更快!
工具包 dev-tools
监听classpath下的文件变动,若有变动,当IDEA被浏览器遮挡时会自动触发重启、或者切换到受影响的类(import 变化的类的类)的页面时也会自动触发重启!
自动编译——需要注意的几点
我的IDEA是2018,其他版本界面可能会有不同,但设置的内容是一致的!
-
1、勾选 Buid Project automatically
-
2、勾选 Compiler autoMake allow when app running
-
3、依赖必不可少
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<build>
<fileName>你自己的工程名字<fileName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
需依赖starter-web、不然可能重启失败、也可以maven刷新导包解决
或者主启动类头上加上注解: @EnableAutoConfiguration 可解决ApplicationContextException
org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
-
4、自动编译快捷键
如果没有勾选、那么自动编译可通过 快捷键 Ctrl + F9 触发自动编译
排除不需重新加载的文件或者目录
禁用重启
如果不想使用重新启动功能,则可以使用该spring.devtools.restart.enabled
属性将其禁用。
主启动类中设置属性为 false即可、或者配置文件中设置!
System.setProperty("spring.devtools.restart.enabled", "false");
局限性:
重新启动功能不适用于使用标准反序列化的对象ObjectInputStream
。如果你需要反序列化的数据,你可能需要使用Spring的ConfigurableObjectInputStream
结合Thread.currentThread().getContextClassLoader()
。
本地使用有效、当打jar包时、热部署自动失效!!!
更多内容 请查看官方文档!
启动时间对比:未使用(43.712s) 热部署(21.279s)
热部署启动