平时使用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。

往期推荐

SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!

如何给SpringBoot配置轻松加密?

MyBatis原生批量插入的坑与解决方案!

SpringBoot官方热部署和远程调试神器,真带劲!相关推荐

  1. SpringBoot官方开发工具,热部署和远程调试真带劲

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

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

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

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

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

  4. springboot项目热部署

    原理 非springboot项目热部署实现原理:服务器去监控其中加载的应用,发现产生了变化就重新加载一次. springboot项目热部署实现原理:基于springboot开发的web工程其实有一个显 ...

  5. Maven(三):将web项目的war包热部署到远程Tomcat服务器

    相关阅读: Maven(一):安装与环境配置.使用Maven搭建web项目 Maven(二):常用命令.依赖管理 Maven(三):将web项目的war包热部署到远程Tomcat服务器 Maven(四 ...

  6. SpringBoot项目热部署配置

    SpringBoot配置热部署后修改代码, 无需重启即可看到修改效果. pom引入spring-boot-devtools依赖 <!--SpringBoot热部署配置 --> <de ...

  7. SpringBoot 配置热部署

    SpringBoot 配置热部署 先来说一说热部署具体有什么样的神奇作用? 再我们平常编写一个web项目时,都知道如果修改html或者jsp这些前端页面,我们浏览器刷新,是可以实时更新的.但是如果修改 ...

  8. SpringBoot 实现热部署

    #SpringBoot实现热部署 ##1.添加依赖 <!-- 热部署 --> <dependency><groupId>org.springframework.bo ...

  9. 关于在IDEA上开发springboot及其热部署等等问题

    耗费了我两天一夜的时间,一把辛酸泪,所以要记录一下 1:IDEA方面 这个IDEA,真的是又爱又恨,喜欢他的操作模式,界面等等一系列,但是麻烦的是很多都跟eclipse不同,大大的不适应,刚开始肯定极 ...

最新文章

  1. 将博客搬至51CTO
  2. underscorejs之 _.indexBy(list, iteratee, [context])
  3. windows服务器连接linux nfs,windows设置通过NFS连接到Linux共享数据
  4. golang 关闭gc 并手动gc_Golang 大杀器之跟踪剖析 trace
  5. 【壁纸】(可商用) 70枚壁纸高清免费
  6. bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫
  7. mysql group by 集合_MySQL高级查询之与Group By集合使用介绍
  8. 2018年计算机学校迎新标语,2018学校迎新标语大全.doc
  9. sturct stat 结构体中 st_mode 的含义
  10. SQL优化笔记(二)—CPU优化
  11. C++ 一周刷完C++基础课程(同C程序进行比较)
  12. 利用kaggle训练模型
  13. 跨浏览器(IE/FF/OPERA)JS代码小结
  14. 华为实习日记——第三十七天
  15. java实现端口扫描
  16. 使用gitee部署静态网页
  17. 爱加密:终止手游之殇,全面解决手游安全问题
  18. NSGA-3优化算法介绍及案例实现(三个测试函数DTLZ1、DTLZ2和DTLZ3)
  19. IP地址的划分(A/B/C/D/E)类
  20. 对图像处理中的面向对象和基于基元的理解

热门文章

  1. BitMap的原理介绍与实现
  2. 问题 B: 调整表中元素顺序(线性表)
  3. 搞懂toString()与valueOf()的区别
  4. 6.6(java学习笔记)文件分割(IO综合例子)
  5. iOS:个人浅谈工厂模式
  6. js 实现网页显示倒计时
  7. Verizon的SDN策略:不鸣则已,一鸣惊人?
  8. wdcp支持两种安装方式
  9. Python基础--环境配置、编码风格、基础概念、基本数据类型(1)
  10. nginx1.10.2源码安装配置参数参考