网站首页 > 文章精选 正文
平时使用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
来源:https://mp.weixin.qq.com/s/KR4eMpH-zCR8OvxHeGL69Q
猜你喜欢
- 2024-12-25 IDEA 中玩转 Git idea的git
- 2024-12-25 第三篇:彻底卸载IntelliJ IDEA 如何卸载idea重新安装
- 2024-12-25 Spring Boot 入门第一天 spring boot简单吗
- 2024-12-25 这样做优化,实现 0.059s 启动一个SpringBoot项目
- 2024-12-25 Apple in Early Talks With Tencent and ByteDance on AI Integration for iPhones in China
- 2024-12-25 IntelliJ IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行
- 2024-12-25 体验IntelliJ IDEA的远程开发(Remote Development)
- 2024-12-25 IDEA 2021.1版本正式发布,完美支持WSL 2
- 2024-12-25 美国IDEA设计大奖名单公布,恒洁八款产品皆上榜
- 2024-12-25 IntelliJ IDEA详细配置图解,挖掘更多的功能
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)