IDEA SpringBoot热部署及遇到的坑
前言
作为一个小白,在开始做SpringBoot项目时,每次手动修改一点点地方都需要手动重启,真是又费时又费力。于是开始研究SpringBoot的热部署,中间遇到些问题,自己研究了很久大概明白了一些(百度下来全都是千篇一律,也真是不想吐槽了),有不正确的地方欢迎指正。
概念(遇到的坑)
在进入教程前,我觉得有必要先了解一些概念的东西,不然会让我们对后面的热部署产生误解(别说了,我就是)
触发机制
可能很多人像我一样,配置的时候度娘基本都是
热部署XXX自动更新
之内的字眼,让我们误以为热部署配置完成后就全自动的部署。
经过我多次的测试,热部署触发是在文件保存之后。
IDEA自动保存不会触发热部署?
在IDEA配置完SpringBoot热部署之后,为什么不会自动触发?或者时而触发,时而不触发?
那是因为IDEA的默认配置中,保存操作是在从IDEA切换到其他应用时保存。
如果想更频繁的保存,可以勾选第三项,并设置一个时间。eg:当应用程序空闲1秒后保存文件。
热部署与热加载
热部署与热加载都可以实现不重启服务器编译、部署项目,但他们的区别如下:
- 热部署:在运行时重新部署项目,重新加载整个应用
- 热加载:在运行时重新加载Class
如果你在此之前已经百度过其他的教程,你对下面这幅图一定不会陌生。
没错,这里是项目启动时配置的地方。图中框出的就是配置热加载(HotSwap)的地方。我个人认为,配置这里对自动热部署没有直接关系,热部署配置这里属于无用的配置。
- On ‘Update’ action:手动点击Update之后触发
- On frame deactivation:从IDEA切换到其他应用时触发
疑问:既然热加载也可以实现重新的加载,为什么我们还要配置热部署?
回答:
- 热加载只加载Class,不能保证环境一致。
- IDEA热加载(HotSwap)目前只支持对方法body的修改,不支持对类和方法签名的修改(比如改类名、方法名、方法参数等)
官方也曾答疑过这个问题,
跳转链接
实战测试热加载:
- 配置
- 修改方法内容
- 修改方法
- 目前还知道修改请求路径这些也是无法热加载的
热部署配置
前提:开启自动编译
要自动热部署,不仅要保存触发操作,还需要我们编译好文件。为了省事,配置一下IDEA的自动编译。
-
File -> settings -> Build,Execution,Deplyment -> compiler
仅在不运行/调试时自动编译
-
option + command + shift + / (MAC) 或者 ctrl + alt + shift + / (WIN)打开Maintenance,选择Registry…
搜索并找到app.running这一项,勾选表示程序运行时自动编译
SpringLoaded方式实现热部署
不会重启整个项目,但需要配置启动参数、下载Jar包
-
可以在Maven仓库或者其他地方下载Jar包
- IDEA中配置启动参数
-javaagent:/Users/doubly/Desktop/springloaded-1.2.8.RELEASE.jar -noverify
图中红框是Jar包的路径,我这里取得是绝对路径。
本来其实是想Maven中加这个依赖,就不需要下载Jar包了,但是不知道这里的路径应该怎么填写,有大神知道的可以指导小弟一下
- Debug启动,修改后可以自动热部署
图中这个提示就是热部署时打印出来的,但这个警告我不知道是什么,没有去查
Springboot-devtools方式实现热部署
实现简单,但整个项目全部重启,不过比手动重启快
-
添加依赖
-
Debug启动,实现热部署
其他
因为没有亲自使用过,就不多赘述了
- springloaded与mvn spring-boot:run方式
- IDEA插件,Jrebel