加速 SpringBoot 应用开发,官方热部署神器=>spring-boot-devtools

本文介绍了如何在SpringBoot项目中集成devtools实现快速热部署,包括类加载器原理、配置自动重启策略及远程调试步骤。通过实例演示了如何在开发过程中提高效率,适合开发者日常实践。

平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效。如果你的应用足够大的话,启动可能需要好几分钟。有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款SpringBoot官方的热部署工具spring-boot-devtools,修改完代码后可快速自动重启应用!

spring-boot-devtools简介

SpringBoot官方开发工具,如果你的应用集成了它,即可实现热部署和远程调试。

实现原理

使用该工具应用为什么启动更快了?主要是因为它使用了两种不同的类加载器。基础类加载器用于加载不会改变的类(比如第三方库中的类),重启类加载器用于加载你应用程序中的类。当应用程序启动时,重启类加载器中的类将会被替换掉,这就意味着重启将比冷启动更快!

热部署

接下来我们将集成devtools,来演示下热部署功能。

  • 首先需要在项目的pom.xml文件中,添加devtools的依赖;

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
  • 为了方便测试,我们在项目中添加了如下测试接口;

/**
 * Created by macro on 2021/3/25.
 */
@Api(tags = "TestController", description = "SpringBoot Dev Tools测试")
@Controller
@RequestMapping("/test")
public class TestController {

    @ApiOperation("测试修改")
    @RequestMapping(value = "/first", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult first() {
        String message = "返回消息";
        return CommonResult.success(null,message);
    }
}
  • 然后启动项目,启动成功后通过Swagger访问接口,返回结果如下,访问地址:http://localhost:8088/swagger-ui.html

{
  "code": 200,
  "message": "返回消息",
  "data": null
}
  • 由于在项目构建时,devtools才会自动重启项目,而IDEA默认并没有使用自动构建,此时我们可以修改应用启动配置,设置当IDEA失去焦点时自动构建项目;

图片

  • 修改Controller中的代码,只要修改下message变量即可;

/**
 * Created by macro on 2021/3/25.
 */
@Api(tags = "TestController", description = "SpringBoot Dev Tools测试")
@Controller
@RequestMapping("/test")
public class TestController {

    @ApiOperation("测试修改")
    @RequestMapping(value = "/first", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult first() {
        String message = "返回消息(已修改)";
        return CommonResult.success(null,message);
    }
}
  • 失去焦点后,等待项目自动构建,此时访问接口出现404问题;

{
  "timestamp": "2021-03-29T07:09:05.415+00:00",
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/test/first"
}
  • 由于devtools检测时间和IDEA的编译所需时间存在差异,当IDEA还没编译完成,devtools就已经重启应用了,导致了这个问题,修改application.yml配置文件,添加如下配置即可;

spring:
  devtools:
    restart:
      poll-interval: 2s
      quiet-period: 1s
  • 此时再次访问测试接口,显示内容如下,修改后的代码已经被自动应用了。

{
  "code": 200,
  "message": "返回消息(已修改)",
  "data": null
}

远程调试

devtools除了支持热部署之外,还支持远程调试,接下来我们把应用部署到Docker容器中,然后试试远程调试!

  • 由于SpringBoot默认打包不会包含devtools,所以我们需要先修改下pom.xml

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!--打包时不排除Devtools-->
        <excludeDevtools>false</excludeDevtools>
    </configuration>
</plugin>
  • 接下来需要application.yml文件,添加devtools的远程访问密码;

spring:
  devtools:
    remote:
      secret: macro666
  • 接下来把项目打包成Docker镜像,然后使用如下命令运行起来;

docker run -p 8088:8088 --name mall-tiny-devtools \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny/logs:/var/logs \
-d mall-tiny/mall-tiny-devtools:1.0-SNAPSHOT
  • 添加一个启动配置,修改启动类为org.springframework.boot.devtools.RemoteSpringApplication,配置信息具体如下;

图片

  • 启动该配置,控制台输出如下结果表示远程连接成功;

2021-03-29 15:49:50.991  INFO 7848 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication v2.3.0.RELEASE on DESKTOP-5NIMJ19 with PID 7848
2021-03-29 15:49:51.003  INFO 7848 --- [           main] o.s.b.devtools.RemoteSpringApplication   : No active profile set, falling back to default profiles: default
2021-03-29 15:49:51.664  WARN 7848 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://192.168.5.78:8088 is insecure. You should use a URL starting with 'https://'.
2021-03-29 15:49:52.024  INFO 7848 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2021-03-29 15:49:52.055  INFO 7848 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 2.52 seconds (JVM running for 4.236)
  • 接下来我们再次修改下Controller中的测试代码,只要修改下message变量即可;

/**
 * Created by macro on 2021/3/25.
 */
@Api(tags = "TestController", description = "SpringBoot Dev Tools测试")
@Controller
@RequestMapping("/test")
public class TestController {

    @ApiOperation("测试修改")
    @RequestMapping(value = "/first", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult first() {
        String message = "返回消息(远程调试)";
        return CommonResult.success(null,message);
    }
}
  • 远程调试如果自动构建的话会导致远程服务频繁重启,此时我们可以使用IDEA手动构建,在项目的右键菜单中可以找到构建按钮;

图片

  • 构建成功后可以发现远程服务会自动重启,并应用修改后的代码,访问测试接口返回如下信息;

{
  "code": 200,
  "message": "返回消息(远程调试)",
  "data": null
}

总结

虽说使用SpringBoot官方的devtools可以进行热部署,但是这种方式更像是热重启,如果你想要更快的热部署体验的话可以使用JRebel。

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-devtools

<think>首先,用户的问题是关于解决spring-boot-devtoolsSpringBoot项目中热部署报错的问题。具体是:"spring-boot-devtools热部署报错解决方案"。我需要基于提供的引用信息来回答。回顾引用内容:-引用[1]:提到项目中引入spring-boot-devtools导致问题,需要检查依赖。-引用[2]:给出了配置spring-boot-devtools的步骤,包括依赖、配置和IDEA设置。-引用[3]:警告说在生产环境中不要使用spring-boot-devtools,并给出了依赖引入方式。用户的问题是解决热部署报错的问题。常见的报错原因可能包括配置错误、依赖冲突、IDEA设置不正确等。我的回答需要结构清晰,逐步解决问题。系统指令要求:-使用中文回答。-行内数学表达式用$...$,独立公式用$$...$$(但在这个上下文中,可能不需要数学表达式)。-生成相关问题。-在引用的段落末尾自然地添加引用标识,如[^1]。回答结构:1.**理解问题**:确认用户的问题是关于spring-boot-devtools热部署报错的解决方案。2.**常见原因**:列出可能导致报错的常见原因。3.**解决方案**:一步步提供解决步骤。4.**注意事项**:提醒用户避免常见错误。5.**相关问题**:生成相关问题。基于引用信息:-引用[1]:问题是由引入devtools引起的,需要检查依赖。-引用[2]:提供了配置细节,如添加依赖、设置配置属性。-引用[3]:警告不要在生产环境中使用。所以,解决方案应该包括:-检查依赖是否正确引入。-配置IDE(如IDEA)设置。-检查配置属性。-排除冲突或错误。步骤:1.**添加依赖**:确保在pom.xml中添加了正确的依赖。2.**IDEA设置**:在IntelliJIDEA中启用自动构建和运行时编译。3.**配置属性**:在application.properties或application.yml中设置热部署相关属性。4.**常见错误**:如文件路径错误、缓存问题等。5.**测试**:重启应用并测试热部署。在回答中,自然地融入引用:-例如,提到依赖引入时,引用[^1]和[^3]。-提到配置时,引用[^2]。最后,生成相关问题:-类似于示例,提出3-4个相关问题,如优化热部署、常见问题排查等。完整回答大纲:1.**引言**:简述问题,提供解决方案概述。2.**步骤1:检查依赖**-引用[^1]和[^3]。3.**步骤2:配置IDE**-引用[^2]。4.**步骤3:设置配置属性**-引用[^2]。5.**步骤4:常见报错排查**-如缓存清除、文件权限等。6.**注意事项**-避免生产环境使用。7.**相关问题**-生成3个相关问题。</think>### Spring Boot Devtools 热部署报错解决方案 在Spring Boot项目中,使用`spring-boot-devtools`实现热部署时,常见的报错可能由依赖配置错误、IDE设置不当或缓存问题引起。以下是基于真实经验的逐步解决方案(参考了多个开发案例[^1][^2][^3]),帮助您快速定位并修复问题。 #### 步骤1: 检查依赖配置 确保在`pom.xml`中正确添加了`spring-boot-devtools`依赖,且版本与Spring Boot兼容。错误版本或依赖冲突是常见报错原因[^1][^3]。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <!-- 必须设为runtime,避免编译冲突 --> <version>与您的Spring Boot版本一致</version> <!-- 例如:3.2.4 --> </dependency> ``` - **验证方法**:运行`mvn dependency:tree`检查依赖树,排除冲突包(如重复的`spring-boot-starter`)。 - **常见报错**:若报`ClassNotFoundException`或`NoClassDefFoundError`,通常是版本不匹配或缺少`<scope>runtime</scope>`[^1]。 #### 步骤2: 配置IDE设置(以IntelliJ IDEA为例) IDE未启用自动构建会导致热部署失效或报错。参考以下配置[^2]: 1. **开启自动编译**: - File > Settings > Build, Execution, Deployment > Compiler - 勾选"Build project automatically"。 - 按`Ctrl+Shift+A`,搜索"Registry",勾选`compiler.automake.allow.when.app.running`。 2. **热部署触发设置**: - 修改代码后,按`Ctrl+F9`(手动触发编译)或依赖IDEA的自动保存功能。 - **常见报错**:若报`Application failed to start`,可能是IDEA未正确编译变更文件[^2]。 #### 步骤3: 添加热部署配置属性 在`application.properties`或`application.yml`中设置以下属性,确保热部署路径和排除项正确[^2][^3]: ```properties # 开启热部署功能 spring.devtools.restart.enabled=true # 指定监控的源码路径(默认src/main/java) spring.devtools.restart.additional-paths=src/main/java # 排除静态文件避免无效重启 spring.devtools.restart.exclude=static/**,templates/** # 关闭浏览器LiveReload(可选,减少冲突) spring.devtools.livereload.enabled=false ``` - **常见报错**:若报`FileNotFoundException`,检查`additional-paths`是否包含实际代码目录;若频繁重启,需扩大`exclude`范围[^2]。 #### 步骤4: 排查常见错误场景 - **缓存问题**:清除项目缓存(删除`target`目录),或重启IDE。Devtools依赖类加载器重启,残留缓存会引发报错[^1]。 - **文件权限问题**:在Linux/macOS系统中,确保项目目录有读写权限(运行`chmod -R 755 /your/project/path`)。 - **生产环境误用**:`spring-boot-devtools`仅适用于开发环境,生产环境部署时移除该依赖,否则可能报安全或性能错误[^3]。 - **日志分析**:查看控制台日志,定位具体错误。常见日志关键词: - `Restart failed`:检查步骤2的IDE设置。 - `Unable to open socket`:关闭其他占用端口的进程(默认LiveReload端口35729)。 #### 注意事项 - **兼容性**:确保Spring Boot版本 ≥ 2.x(旧版本可能有已知Bug)。 - **备选方案**:若问题持续,考虑使用JRebel或Spring Loaded作为热部署替代工具。 - **测试建议**:修改一个简单Controller方法,测试热部署是否生效(变更应无需重启即生效)。 通过以上步骤,大多数热部署报错可解决。如果问题依旧,提供具体错误日志以便进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值