Content Table

Spring Boot 热更新

尽快看到修改后的效果在开发中对于提高效率是非常重要的,一般有 2 种方式:

  • 热启动:自动重启整个项目,速度还是比较慢
  • 热加载:只加载变化的内容,例如重新编译的 class,速度相对很快

热启动

Spring Boot 的 org.springframework.boot:spring-boot-devtools 可以用来实现热启动,在 build.gradle 中添加依赖 implementation 'org.springframework.boot:spring-boot-devtools' 即可。

但是 Devtools 的热启动比较慢,例如数据库链接要重新建立。

热加载

热加载的工具有:

  • 免费:Springloaded
  • 收费:JRebel

但是在 Spring Boot 2 中不能再使用 Springloaded 了,热加载方式只能用 JRebel 了,使用 JRebel 可以参考官方文档 JRebel with Spring Boot,下面是简要的步骤:

  • 在 ~/.gradle/gradle.properties 配置 JRebel 的路径:

    • Win:rebelAgent=-agentpath:C:/jrebel/lib/libjrebel64.dll
    • Mac:rebelAgent=-agentpath:/usr/local/jrebel/lib/libjrebel64.dylib
    • Linux:rebelAgent==-agentpath:/usr/local/jrebel/lib/libjrebel64.so
  • 在 build.gradle 中添加:

    1
    2
    3
    if (project.hasProperty('rebelAgent')) {
    bootRun.jvmArgs += rebelAgent
    }

执行 gradle bootRun 启动项目,看到 JRebel 输出的日志,说明 JRebel 生效了。

编译修改的类

不管是 DevTools 还是 JRebel,他们只是监听资源文件或者 class 的变化然后执行热启动或者热加载,并不负责编译被修改的类。当一个类变化后,可以使用以下几种方式进行编译:

  • 自动编译:终端进入项目目录,执行 gradle -t classes 启动一个监听任务,当发现项目中的 Java 类发生变化时进行自动编译,模版文件变化时自动复制到 build 对应的目录中
  • 自动编译: 可以使用 IDEA 的自动编译功能: Compiler -> Build project automatically
  • 手动编译: 修改类后在 IDE 中点击菜单项或者按下快捷键进行编译

提示:控制台中看到 JRebel 生效了,但修改类后却没有看到效果,应该是还没有编译。

更多相关信息请参考 Spring Boot 的文档 Hot Swapping 深入了解热更新。