热部署

JVM引入了HotSwap(热加载),它针对的是单个字节码文件,重新编译后不需要停机就可以加载使用新的class文件。基于此,实现了热部署,即修改代码后无需重启就可以加载修改的代码,热部署针对的是容器或者整个应用。关于热部署其实有两个部分:

  • 重启(restart):自定义开发代码,加载位置为restart类加载器
  • 重载(reload):jar包,加载位置为base类加载器

 而重启为什么快于重新启动项目呢?

spring-boot-devtools插件而言,重新启动项目的话,需要使用RestartClassLoader和JDK中的类加载器,而热部署的重启就只会使用RestartClassLoader

第一种实现方式(基于idea)

Edit Configuration修改如下

  

java热部署工具 springboot java -jar热部署_java热部署工具

 

Ctrl+F9即可

  

java热部署工具 springboot java -jar热部署_重启_02

 

   缺点:Java的虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作

第二种实现方式(基于spring-boot-devtools插件)

devtools的依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
</dependency>

Ctrl+F9即可

实现自动热部署

  自动热部署功能开启有两步

  1. setting-->Build,Execution,Deployment-->Complier-->Build project automatically打上✔
  2. setting-->Advanced Settings-->Allow auto-make to start even if developed application is current running打上✔

  每次修改代码后,只需要鼠标失去在idea中的焦点五秒左右就会自动重启。

自定义不参与重启的排除项

  

java热部署工具 springboot java -jar热部署_java热部署工具_03

 

 

   按如上图格式书写即可,注意用逗号分开,且不能有空格。

关闭热部署功能

@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。