热部署
JVM引入了HotSwap(热加载),它针对的是单个字节码文件,重新编译后不需要停机就可以加载使用新的class文件。基于此,实现了热部署,即修改代码后无需重启就可以加载修改的代码,热部署针对的是容器或者整个应用。关于热部署其实有两个部分:
- 重启(restart):自定义开发代码,加载位置为restart类加载器
- 重载(reload):jar包,加载位置为base类加载器
而重启为什么快于重新启动项目呢?
spring-boot-devtools插件而言,重新启动项目的话,需要使用RestartClassLoader和JDK中的类加载器,而热部署的重启就只会使用RestartClassLoader
第一种实现方式(基于idea)
Edit Configuration修改如下
Ctrl+F9即可
缺点:Java的虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作
第二种实现方式(基于spring-boot-devtools插件)
devtools的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Ctrl+F9即可
实现自动热部署
自动热部署功能开启有两步
- setting-->Build,Execution,Deployment-->Complier-->Build project automatically打上✔
- setting-->Advanced Settings-->Allow auto-make to start even if developed application is current running打上✔
每次修改代码后,只需要鼠标失去在idea中的焦点五秒左右就会自动重启。
自定义不参与重启的排除项
按如上图格式书写即可,注意用逗号分开,且不能有空格。
关闭热部署功能
@SpringBootApplication
public class HotDeployApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(HotDeployApplication.class, args);
}
}
只需要设置spring.devtools.restart.enabled的属性为false。