Spring Boot 如何实现热部署?
Spring Boot 实现热部署(Hot Deployment/Hot Swapping)主要有两种方式:
- 使用
spring-boot-devtools(官方推荐,免费,最常用) - 使用 JRebel(第三方插件,收费,功能更强大)
下面详细介绍这,两种方式的配置步骤,以 IntelliJ IDEA 为例。
方式一:使用 Spring Boot DevTools (官方方案)
DevTools 的原理实际上是快速重启。它使用两个 ClassLoader:一个加载不会变的类(第三方 Jar 包),另一个加载你会修改的类。当代码变更时,只重新加载后者,所以速度比完全重启快很多。
1. 添加依赖 (pom.xml)
在 pom.xml 中引入 spring-boot-devtools 依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional> <!-- 标记为可选,防止传递依赖 -->
</dependency>
2. 修改配置文件 (application.yml / properties)
虽然默认配置通常可用,但建议添加以下配置以确保生效:
yaml
spring:
devtools:
restart:
enabled: true # 开启热部署
additional-paths: src/main/java # 监控的额外路径
exclude: static/,public/ # 排除静态资源,修改它们不需要重启
3. IntelliJ IDEA 配置 (关键步骤)
IDEA 默认不会自动编译,因此需要修改设置让 DevTools 生效。
步骤 A:开启自动编译
- 打开
Settings(Windows: Ctrl+Alt+S / Mac: Cmd+,) - 进入
Build, Execution, Deployment->Compiler - 勾选 Build project automatically。
- 打开
步骤 B:允许运行时自动构建
- 旧版 IDEA (2021.2 之前): 按
Ctrl+Shift+Alt+/,选择Registry,勾选compiler.automake.allow.when.app.running。 - 新版 IDEA (2021.2 之后): 打开
Settings->Advanced Settings-> 勾选 Allow auto-make to start even if developed application is currently running。
- 旧版 IDEA (2021.2 之前): 按
4. 如何触发热部署
配置完成后,当你修改了 Java 代码:
- 自动触发: 如果开启了上述的自动编译,IDEA 失去焦点(切换窗口)几秒后会自动触发。
- 手动触发(推荐): 修改代码后,按下
Ctrl + F9(Build Project),Spring Boot 会检测到变化并进行快速重启。
方式二:使用 JRebel (收费/破解方案)
JRebel 是通过修改字节码实现的真·热部署。它不需要重启 Spring 上下文,直接在内存中替换类,速度极快,且能保持 Session 状态。
1. 安装插件
在 IDEA 的 Settings -> Plugins 中搜索 JRebel and XRebel 并安装。
2. 激活
JRebel 是收费软件,安装后需要激活(可以使用试用版或购买许可证)。
3. 配置项目
- 在 IDEA 左下角找到
JRebel面板。 - 勾选你的 Spring Boot 项目。
- 这会在
src/main/resources下生成一个rebel.xml文件。
4. 启动与触发
- 启动: 不要用普通的 Run/Debug 按钮,要使用 JRebel 专属的 "Run with JRebel" 或 "Debug with JRebel" 按钮(图标通常是火箭或带 JRebel logo 的虫子)。
- 触发: 修改代码后,按
Ctrl + F9(Build Project),JRebel 会提示类已重新加载,无需任何重启。
总结与对比
| 特性 | Spring Boot DevTools | JRebel |
|---|---|---|
| 原理 | 冷启动优化 (Restart ClassLoader),本质是重启 | 字节码替换 (Hot Swap),不重启 |
| 速度 | 较快 (几秒钟),但在大项目中会变慢 | 极快 (毫秒级) |
| 状态保持 | 重启后 Session 等内存数据会丢失 | 保持 Session 和内存状态 |
| 成本 | 免费 (官方自带) | 收费 (价格较高) |
| 适用场景 | 中小型项目,个人开发 | 大型单体项目,追求极致效率 |
建议: 大多数情况下,DevTools 配合 Ctrl + F9 已经足够使用。如果是巨型单体应用,启动一次需要几分钟的那种,强烈建议申请经费购买 JRebel。