spring boot热更新

232 阅读2分钟

其实有点奇怪,按道理说web服务器的热更新应该是刚需服务,但是网络上关于java spring boot的热更新配置极少。难道大家都已经习惯了写完代码,按一次编译运行?写业务的话那得多繁琐啊,效率能低的吓人。

首先定义下什么是热更新:在写完代码并保存后,将自动触发我的服务编译与重启运行。以尽可能的减少手工操作。

软件版本

  1. OpenJDK 17.0.11
  2. Gradle 7.6.4

操作步骤

  1. 使用gradle生成一个默认的gradle application项目
  2. 修改gradle配置文件build.gradle,添加项目依赖
dependencies {
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
  1. 修改应用配置 src/main/resources/application.properties,添加配置如下。其中第二项配置将确保修改java源码后触发编译与重启(为什么还需要这样手工配置,我表示很奇怪)
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java/
  1. 修改gradle配置文件build.gradle,添加配置如下,以确保保存文件时触发编译生成的字节码文件和gradle bootRun执行生成的字节码文件统一(为啥会这样,我也很奇怪)。不然二者不统一,无法达到自动更新服务的目的,一个生成在bin目录,一个生成在build目录。。。
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
            destinationDirectory = file("bin/main")
        }
    }
}

经过上述配置修改,就可以快乐的热更新了

我的开发环境

lunarVim + coc.nvim, 没有直接使用IDE。VSCode相关的修改应该是大同小异。理论上这些IDE,也只是在gradle的基础上套了一层壳而已。如果有需要可以对具体的IDE进行讨论

资料参考

Let’s start with SpringBoot Dev Tools and the back end!

帮我避开了一些坑,阅读了上面这篇文章我才发现,gradle默认编译输出和DevTools自动编译输出的位置是不一样的。。。Orz,我是真不太理解,java刚入坑倒腾下而已。