尽快看到修改后的效果在开发中对于提高效率是非常重要的,一般有 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
- Win:
在 build.gradle 中添加:
1
2
3if (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 深入了解热更新。