SpringBoot官方热部署和远程调试神器

平时使用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失去焦点时自动构建项目;

1a470aa5a297a8904ba3db66c0caffaa.png
  • 修改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,配置信息具体如下;

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

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手动构建,在项目的右键菜单中可以找到构建按钮;

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

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

总结

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

6d5db798f6754cead1761864511a0d38.gif

往期推荐

ed36ebbdaf9319169b58830a8577f262.jpeg

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


f99300f39d544719d1756406e394bb63.jpeg

如何给SpringBoot配置轻松加密?


d339ebccbdc8e70bd0c244f04b23a767.jpeg

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 小程序支付后台示例_C中的#if指令示例| C预处理程序

c# 小程序支付后台示例The #if is a preprocessor directive in C programming language and it is used for conditional compilation. #if是C编程语言中的预处理程序指令&#xff0c;用于条件编译。 General for of the #if directive is: #if指令的常规为&#xff1a; #if…

MySQL 优化:Explain 执行计划详解

昨天中午在食堂&#xff0c;和部门的技术大牛们坐在一桌吃饭&#xff0c;作为一个卑微技术渣仔默默的吃着饭&#xff0c;听大佬们高谈阔论&#xff0c;研究各种高端技术&#xff0c;我TM也想说话可实在插不上嘴。聊着聊着突然说到他上午面试了一个工作6年的程序员&#xff0c;表…

c语言中的逻辑运算符_C / C ++中的逻辑运算符

c语言中的逻辑运算符逻辑运算符 (Logical Operators) Logical operators are used to check the combinations of the two conditional expressions. 逻辑运算符用于检查两个条件表达式的组合。 The following are the types of logical operators. 以下是逻辑运算符的类型 。…

顶级 Javaer 常用的 14 个类库

作者&#xff1a;小姐姐味道昨天下载下来Java16尝尝鲜。一看&#xff0c;好家伙&#xff0c;足足有176MB大。即使把jmc和jvisualvm给搞了出去&#xff0c;依然还是这么大&#xff0c;真的是让人震惊不已。但即使JDK足够庞大&#xff0c;它的功能也已经不够用了。我们需要借助于…

势头迅猛的儿童手表:恐陷下一个文曲星之地?

历史的节奏&#xff0c;就是不断重复此前发生过的事。虽然表现形态不一&#xff0c;但蕴藏的规律、趋势总是有着惊人的相似。在科技行业&#xff0c;同样如此——iPhone开启的智能手机时代走过的大兴—→平稳→下降态势&#xff0c;与PC的历程几乎是一样的。而在国内&#xff0…

scala 类中的对象是类_Scala中的类和对象

scala 类中的对象是类Scala中的课程 (Classes in Scala) A class is a blueprint for objects. It contains the definition of all the members of the class. There are two types of members of the class in Scala, 类是对象的蓝图。 它包含该类的所有成员的定义。 Scala中…

2022年终总结:不再用“拼命”来应对极度的不安全感

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;人生匆匆三十四余载&#xff0c;今天又到了辞旧迎新和 2022 年说再&#xff08;也不&#xff09;见的时刻了&#xff0c;所以…

c++中std::find_std :: find()与C ++中的示例

c中std::findfind()作为STL函数 (find() as a STL function) find() is an STL function that comes under the <algorithm> header file which returns an iterator to the first occurrence of the searching element within a range. find()是STL函数&#xff0c;位于…

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的&#xff0c;一方面是给公司招聘用&#xff0c;另一方面是想用它来挖掘在 Java 技术栈中&#xff0c;还有那些知识点是我不知道的&#xff0c;我想找到这些技术盲点&#xff0c;然后修复它&#xff0c;以此来提高自己…

python打印多个变量_在Python中打印多个变量

python打印多个变量Like other programming languages, In python also, we can define and print the multiple variables. Here, we see how can we print the single and multiple variables using the print() function? 像其他编程语言一样&#xff0c;在python中&#x…

js之ActiveX控件使用说明 new ActiveXObject()

什么是 ActiveX 控件&#xff1f; ActiveX 控件广泛用于 Internet。它们可以通过提供视频、动画内容等来增加浏览的乐趣。不过&#xff0c;这些程序可能出问题或者向您提供不需要的内容。在某些情况下&#xff0c;这些程序可被 用来以您不允许的方式从计算机收集信息、破坏您的…

vim中的jk为什么是上下_JK轮胎的完整形式是什么?

vim中的jk为什么是上下JK轮胎&#xff1a;Juggilal Kamlapat Ji轮胎 (JK Tyres: Juggilal Kamlapat Ji Tyres) JK Tyre and Industries is an abbreviation of Juggilal Kamlapat Ji Tyres & Industries Ltd. It is an Automobile Tyre, Tubes and Flaps manufacturing com…

【C语言】第二章 类型、运算符和表达式

为什么80%的码农都做不了架构师&#xff1f;>>> 变量和常量是程序处理的两种基本数据对象。 声明语句说明变量的名字及类型&#xff0c;也可以指定变量的初值。 运算符指定要进行的操作。 表达式则把变量与常量组合起来生成新的值。 对象的类型决定该对象可取值的集…

移动最小二乘_最小移动以形成弦

移动最小二乘Problem statement: 问题陈述&#xff1a; Given a string S, write a program to check if it is possible to construct the given string S by performing any of the below operations any number of times. In each step, you can: 给定字符串S &#xff0c;…

转: 加快Android编译速度

转&#xff1a; http://timeszoro.xyz/2015/11/25/%E5%8A%A0%E5%BF%ABandroid%E7%BC%96%E8%AF%91%E9%80%9F%E5%BA%A6/ 加快Android编译速度 发表于 2015-11-25 | 对于Android开发者而言&#xff0c;随着工程不断的壮大&#xff0c;Android项目的编译时间也逐渐变长&#xff…

ipv6寻址_什么是IPV4寻址?

ipv6寻址IPV4寻址简介 (Introduction to IPV4 Addressing ) Internet protocol version 4 in any network, is a standard protocol for assigning a logical address (IP address) to hosts. You are currently using the same protocol. This protocol is capable of providi…

1593: [Usaco2008 Feb]Hotel 旅馆

1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 489 Solved: 272[Submit][Status][Discuss]Description 奶牛们最近的旅游计划&#xff0c;是到苏必利尔湖畔&#xff0c;享受那里的湖光山色&#xff0c;以及明媚的阳光。作为整个旅游的策划…

最长递增子序列 子串_最长递增子序列

最长递增子序列 子串Description: 描述&#xff1a; This is one of the most popular dynamic programming problems often used as building block to solve other problems. 这是最流行的动态编程问题之一&#xff0c;通常用作解决其他问题的基础。 Problem statement: 问…

beta版本项目冲刺

项目冲刺第一天项目冲刺第二天项目冲刺第三天项目冲刺第四天项目冲刺第五天项目冲刺第六天项目冲刺第七天转载于:https://www.cnblogs.com/malinlin/p/5006041.html

mkdir 函数_PHP mkdir()函数与示例

mkdir 函数PHP mkdir()函数 (PHP mkdir() function) The full form of mkdir is "Make Directory", the function mkdir() is used to create a directory. mkdir的完整格式为“ Make Directory” &#xff0c; 函数mkdir()用于创建目录。 Syntax: 句法&#xff1a…