其实有点奇怪,按道理说web服务器的热更新应该是刚需服务,但是网络上关于java spring boot的热更新配置极少。难道大家都已经习惯了写完代码,按一次编译运行?写业务的话那得多繁琐啊,效率能低的吓人。
首先定义下什么是热更新:在写完代码并保存后,将自动触发我的服务编译与重启运行。以尽可能的减少手工操作。
软件版本
- OpenJDK 17.0.11
- Gradle 7.6.4
操作步骤
- 使用gradle生成一个默认的gradle application项目
- 修改gradle配置文件build.gradle,添加项目依赖
dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
- 修改应用配置 src/main/resources/application.properties,添加配置如下。其中第二项配置将确保修改java源码后触发编译与重启(为什么还需要这样手工配置,我表示很奇怪)
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java/
- 修改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刚入坑倒腾下而已。