平时使用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)@ResponseBodypublic 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)@ResponseBodypublic 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: 2squiet-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)@ResponseBodypublic 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

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

加速 SpringBoot 应用开发,官方热部署神器真带劲!相关推荐

  1. 加速 SpringBoot 应用开发,官方热部署神器真带劲

    平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效.如果你的应用足够大的话,启动可能需要好几分钟.有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp ...

  2. SpringBoot 热部署神器快速重启的秘密!

    今天咱们来聊聊这个热部署神器 spring-boot-devtools 的运行原理,看看它是怎么用这个 ClassLoader  来实现快速重启,帮我们节省时间的!

  3. 【SpringBoot】项目实现热部署的两种方式

    前言 spring boot : 2.0.0.RELEASE maven eclipse 另外还需清楚什么是热部署,以及为什么要热部署. SpringBoot项目中实现热部署的两种方式,使得部署变得异 ...

  4. springboot+JRebel--插件实现热部署

    刚开始使用springboot的时候发现每次有代码修改都需要重启,真的不要太麻烦!!!!! 决心研究下如何热部署! 个人能力有限,暂时仅了解两种方式,写出来与大家分享! 本章分享第二种方法!sprin ...

  5. SpringBoot官方热部署和远程调试神器,真带劲!

    平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效.如果你的应用足够大的话,启动可能需要好几分钟.有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp ...

  6. 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控

      导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...

  7. SpringBoot+gradle+idea实现热部署和热加载

    前言 因为之前使用myeclipes的同学就知道,在使用myeclipes的时候,java文件或者jsp文件写完之后会被直接热加载到部署的容器中,从而在开发的时候,不同经常去重启项目,从而达到了增加开 ...

  8. springboot+IntelliJ IDEA实现热部署

    问题:在没有使用springboot前,我们很方便的可以使用开发工具的热部署功能,在此不赘述之前的方法了,而使用springboot集成开发后就可以继续使用热部署么?答案是肯定的 解决方法:分三步走 ...

  9. Spring Boot 开发环境热部署(HotSwap)详解

    前言 Spring Boot 提出了多项开箱即用的功能特性,但归根到底还是围绕简化应用的创建.开发.运行.开发环境下我们经常对项目代码进行变动,如果每次都重新启动应用会浪费我们大量时间,为此就产生了多 ...

最新文章

  1. linux重做引导分区,linuxgrub 0.97三重引导,基本无解,除非重做硬盘
  2. 大牛书单 | 云原生技术领域好书推荐
  3. zoj 3209 Dancing links/hust 1017
  4. Jsp Spring Security 权限管理系统
  5. Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
  6. jQuery中的视图样式和动画效果
  7. 北京工业大学c语言期末考试题,北京工业大学C语言部分练习答案.docx
  8. 马斯克2021五大预测:重返月球并比赛遥控汽车,全面实现自动驾驶,你pick哪一个?...
  9. 数据结构最佳路径代码_【微服务】149:商品数据结构
  10. Android 生态消息推送平台介绍
  11. AngularJS 之 ng-model
  12. 固态硬盘用软件测试温度高,硬盘温度过高的原因,固态硬盘温度过高-
  13. 使用gsds绘制基因结构图_基因结构图的绘制
  14. 1055 习题4-9-3 逆序输出正整数各位上数字
  15. 佐治亚理工计算机科学在线硕士,佐治亚理工学院计算机研究生申请要求及截止时间一览...
  16. UI设计中按钮如何设计,常见的按钮设计类型
  17. CREO图文教程:三维设计案例之油缸顶物体的骨架模型设计图文教程之详细攻略
  18. 直播源代码图片验证码
  19. fcpx如何清除缓存?Final Cut Pro X 清除缓存方法
  20. 玩转PYthon,用Python绘制全球疫情变化地图(好东西,值得一看~~~)

热门文章

  1. java ssm项目_JAVA项目:逝去的SSM
  2. android日志打印机制,Android4_使用Log打印
  3. 学JAVA要学redis_新手学习Java对Redis简单操作
  4. 二叉树经典题之根据二叉树创建字符串(二叉树的括号表示法)
  5. windows服务编写原理(上)
  6. Shell 计算两个数的加减乘除取余(+、-、*、\、/)
  7. Linux查看系统cpu个数、核心数、线程数
  8. linux kvm 常用命令
  9. crontab命令使用记录(精,反弹shell)
  10. OPENSTACK重装系统失败导致虚拟机状态为error