spring-boot-devtools热部署详解

本文介绍如何在Spring Boot项目中使用spring-boot-devtools实现热部署。通过配置IDEA和添加依赖,可实现在修改代码后自动重启应用,加快开发迭代速度。
在开发项目过程中,当修改了某些代码后需要本地验证时,需要重启本地服务进行验证,启动这个
项目,如果项目庞大的话还是需要较长时间的,spring开发团队为我们带来了一个插件:spring-boot devtools,很好的解决了本地验证缓慢的问题。

一. 热部署实现演示

(一)添加spring-boot-devtools热部署依赖启动器

Spring Boot项目进行热部署测试之前,需要先在项目的pom.xml文件中添加spring-boot-devtools热部署依赖启动器:
<!-- 引入热部署依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
由于使用的是IDEA开发工具,添加热部署依赖后可能没有任何效果,接下来还需要针对IDEA开发
工具进行热部署相关的功能设置

(二)IDEA工具热部署设置

选择IDEA工具界面的【File->Settings】选项,打开Compiler面板设置页面

 

选择Build下的Compiler选项,在右侧勾选“Build project automatically”选项将项目设置为自动编
译,单击【ApplyOK】按钮保存设置
在项目任意页面中使用组合快捷键“Ctrl+Shift+Alt+/”打开Maintenance选项框,选中并打开
Registry页面,具体如图1-17所示

 

列表中找到“compiler.automake.allow.when.app.running”,将该选项后的Value值勾选,用于指
IDEA工具在程序运行过程中自动编译,最后单击【Close】按钮完成设置

二. 热部署原理分析

该原理其实很好说明,就是我们在编辑器上启动项目,然后改动相关的代码,然后编辑器自动触发编译替换掉历史的.class文件后,项目检测到有文件变更后会重启srpring-boot项目。
可以看看官网的触发描述:

 

可以看到,我们引入了插件后,插件会监控我们classpath的资源变化,当classpath有变化后,会触发重启

 

 

这里提到了,该插件重启快速的原因:这里对类加载采用了两种类加载器,对于第三方jar包采用baseclassloader来加载,对于开发人员自己开发的代码则使用restartClassLoader来进行加载,这使得比停 掉服务重启要快的多,因为使用插件只是重启开发人员编写的代码部分。

验证:

package com.lagou.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.DispatcherServlet;

@Component
public class Devtools implements InitializingBean {

    private static final Logger log = LoggerFactory.getLogger(Devtools.class);

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("guava-jar classLoader: " + DispatcherServlet.class.getClassLoader().toString());
        log.info("Devtools ClassLoader11: " + this.getClass().getClassLoader().toString());
    }

}
这边先去除spring-boot-devtools插件,跑下工程:

 

可以看到,DispatcherServlet(第三方jar包)和Devtools(自己编写的类)使用的都是AppClassLoader加载的。
我们现在加上插件,然后执行下代码:
发现第三方的jar包的类加载器确实是使用的系统的类加载器,而我们自己写的代码的类加载器为
RestartClassLoader,并且每次重启,类加载器的实例都会改变。
修改代码前.png

 

修改代码后.png

上图为代码修改前后类文件的变更。 

三. 排除资源

某些资源在更改后不一定需要触发重新启动。例如,Thymeleaf模板可以就地编辑。默认情况下,改变资源 /META-INF/maven /META-INF/resources /resources /static /public
/templates 不触发重新启动,但确会触发现场重装。如果要自定义这些排除项,则可以使用该
spring.devtools.restart.exclude 属性。例如,仅排除 /static /public 您将设置以下属性:
spring.devtools.restart.exclude=static/**,public/**

 

`spring-boot-devtools` 是 Spring Boot 提供的一个开发工具模块,用于提升开发者在开发阶段的效率和体验。它不是生产环境使用的组件,而是专为本地开发设计的“开发者助手”。 --- ### ✅ 1. 添加 `spring-boot-devtools` 依赖(Maven 示例) ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies> ``` > ⚠️ 注意: > - `<optional>true</optional>`:表示该依赖不会被传递到其他项目中。 > - `<scope>runtime</scope>`:编译时不需要,运行时才需要。 --- ### ✅ 2. 主要功能详解 #### ✅ (1) **自动重启(Automatic Restart)** - 当类路径下的文件(如 Java 类、配置文件)发生变化时,应用会**自动重启**。 - 使用两个类加载器: - **Base ClassLoader**:加载第三方 JAR(如 Spring 框架、库) - **Restart ClassLoader**:加载你自己的代码 - 只有你的代码变化时,只需重启 Restart 类加载器,显著加快启动速度。 📌 默认监听目录:`/src/main/java` 和 `/src/main/resources` > 修改 `.java` 文件 → 编译后触发重启 > 修改 `application.yml` → 直接触发重启(无需重新编译) #### ✅ (2) **LiveReload 服务器(页面热更新)** - 内置一个 LiveReload 服务器,当静态资源(HTML、CSS、JS)改变时,浏览器自动刷新。 - 需要安装浏览器插件或使用支持 LiveReload 的 IDE(如 IntelliJ IDEA)。 启用方式(默认开启): ```properties # application.properties spring.devtools.livereload=true ``` #### ✅ (3) **禁用缓存(适用于模板引擎)** - 在开发中禁用 Thymeleaf、Freemarker、Mustache 等模板缓存,实现修改即生效。 例如 Thymeleaf 自动设置: ```properties spring.thymeleaf.cache=false spring.thymeleaf.prefix=file:src/main/resources/templates/ ``` > 所以你改了 HTML 页面,刷新浏览器就能看到效果,无需重启。 #### ✅ (4) **全局配置(通过 `spring.devtools.properties`)** 创建文件:`src/main/resources/META-INF/spring-devtools.properties` 内容示例: ```properties # 设置远程调试端口 remote.debug.port=8000 # 自定义重启触发条件 spring.devtools.restart.additional-paths=src/main/resources/config spring.devtools.restart.exclude=/**/*.log,/static/** ``` #### ✅ (5) **条件性关闭某些特性(按环境)** ```properties # 仅在 dev 环境启用 devtools spring.devtools.add-properties=true ``` 或通过代码控制: ```java @Component public class DevConfig { @Value("${spring.devtools.restart.enabled:true}") private boolean restartEnabled; } ``` #### ✅ (6) **远程调试(Remote Debugging)—— 高级功能** > ❗ 注意:此功能已从 Spring Boot 2.7 开始**弃用并移除**。 以前支持 `spring-boot:run` 远程部署 + 热更新,但现在不推荐使用。 --- ### ✅ 3. 如何工作?原理简述 | 特性 | 原理 | |------|------| | 自动重启 | 使用两个类加载器,只重载用户类 | | LiveReload | 启动内嵌 WebSocket 服务通知浏览器刷新 | | 缓存禁用 | 开发环境下自动覆盖模板、静态资源缓存属性 | --- ### ✅ 4. 注意事项与最佳实践 | 问题 | 解决方案 | |------|----------| | 生产环境中不应包含 devtools | 设置 `<optional>true</optional>`,避免被打包进最终 jar | | IDEA 不自动编译 | 开启 "Build project automatically" 并启用 "Compiler -> Build Project Automatically" | | 修改文件不触发重启 | 检查是否在监听路径内;手动 Build(Ctrl+F9)触发 | | DevTools 不生效 | 确保开启了自动编译,并且类路径正确 | | 占用内存较高 | 因双类加载器机制,开发时可接受 | --- ### ✅ 5. 常用配置项(`application.properties`) ```properties # 是否启用重启(默认 true) spring.devtools.restart.enabled=true # 额外监听的路径 spring.devtools.restart.additional-paths=src/main/resources/config # 排除不触发重启的路径 spring.devtools.restart.exclude=/**/*.log, /static/** # 启用 LiveReload spring.devtools.livereload.enabled=true spring.devtools.livereload.port=35729 # 启用属性打印(启动时显示 DEVTOOLS 设置) spring.devtools.add-properties=true ``` --- ### ✅ 6. 与 IDE 配合使用(IntelliJ IDEA) 1. **开启自动编译**: - `Settings → Build → Compiler → Build project automatically` 2. **启用运行时编译**: - `Registry... → compiler.automake.allow.when.app.running` 3. 保存文件后,应用自动重启。 --- ### ✅ 7. 在 Java 应用中的影响示例 ```java @RestController public class HelloController { private int counter = 0; @GetMapping("/hello") public String hello() { return "Hello, count=" + (++counter); } } ``` - 启动后访问 `/hello` 返回 `Hello, count=1` - 修改返回字符串为 `"Hi!"` - 保存 Java 文件 → DevTools 触发重启 → 访问 `/hello` 显示 `"Hi!, count=1"`(计数器重置) 说明:**状态丢失是正常的**,因为 JVM 重启了。 --- ### ✅ 总结:`spring-boot-devtools` 的优势 | 优点 | 说明 | |------|------| | 快速反馈 | 修改代码后秒级重启 | | 提高效率 | 减少手动 `mvn spring-boot:run` | | 资源热更新 | 支持页面、配置实时刷新 | | 易于集成 | 只需添加依赖即可 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值