1.spring-boot-devtools(推荐)
在pom.xml中添加下面依赖
<!--快重启-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 可选 -->
</dependency>
然后在Settings→Build→Compiler中将Build project automatically勾选上
最后按ctrl+shift+alt+/ 选择registy,将compiler.automake.allow.when.app.running勾选。
如上,这样就可以实现热部署了。(操作完成,记得重启下IDEA)
但实际上,org.springframework.boot所实现的功能是快速启动,加上自动编译就能实现所谓的”热部署“了。
Build project automatically就代表着自动编译,但这项设定只在debug模式生效,所以要通过org.springframework.boot使其在普通运行模式也能自动编译。
注意:上面说Build project automatically在debug模式也能生效,但是经过我的测试,并不行,所以还是老老实实勾选compiler.automake.allow.when.app.running吧。另外,对于某些idea没有这个选项的,设置好其他的之后,ctrl+f9也是可以的。
例如:
对于idea2021,在如下地方进行修改:
关注:如果你每敲一个字母,服务器就重新构建一次,这未免有点太频繁了,所以idea设置当idea工具失去焦点5秒后进行热部署。其实就是你从idea工具中切换到其他工具时进行热部署,比如改完程序需要到浏览器上去调试,这个时候idea就自动进行热部署操作。
2.idea的热部署功能
实际上idea已经带有一个热部署的功能了,如下图:
再设置Build project automatically和org.springframework.boot
再编辑启动配置
按照图示点开窗口并修改设置,在每次更新时更新类和资源
OK,这样也能实现热部署(记得重启idea)
解决 spring boot devtool 热部署后出现访问404问题
DevTools的检测时间和idea的编译所需时间存在差异。在idea还没完成编译工作前,DevTools就开始进行重启和加载,导致@RequestMapping没有被全部正常处理。其他方法没试,就直接用了看起来最简单的方法:牺牲一点时间,去加长devtools的轮询时间,增大等待时间。
解决方案如下:yml配置文件新增配置
spring.devtools.restart.poll-interval=3000ms
spring.devtools.restart.quiet-period=2999ms
spring:
devtools:
restart:
poll-interval: 3000
quiet-period: 2999
参与热部署监控的文件范围配置
通过修改项目中的文件,你可以发现其实并不是所有的文件修改都会激活热部署的,原因在于在开发者工具中有一组配置,当满足了配置中的条件后,才会启动热部署,配置中默认不参与热部署的目录信息如下
/META-INF/maven
/META-INF/resources
/resources
/static
/public
/templates
以上目录中的文件如果发生变化,是不参与热部署的。如果想修改配置,可以通过application.yml文件进行设定哪些文件不参与热部署操作
spring:
devtools:
restart:
# 设置不参与热部署的文件或文件夹
exclude: static/**,public/**,config/application.yml
通过配置可以修改不参与热部署的文件或目录
关闭热部署
线上环境运行时是不可能使用热部署功能的,所以需要强制关闭此功能,通过配置可以关闭此功能。
spring:
devtools:
restart:
enabled: false
如果当心配置文件层级过多导致相符覆盖最终引起配置失效,可以提高配置的层级,在更高层级中配置关闭热部署。例如在启动容器前通过系统属性设置关闭热部署功能。
@SpringBootApplication
public class SSMPApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled","false");
SpringApplication.run(SSMPApplication.class);
}
}
其实上述担心略微有点多余,因为线上环境的维护是不可能出现修改代码的操作的,这么做唯一的作用是降低资源消耗,毕竟那双盯着你项目是不是产生变化的眼睛只要闭上了,就不具有热部署功能了,这个开关的作用就是禁用对应功能
这样就可以通过配置关闭热部署功能降低线上程序的资源消耗
参考链接:
https://blog.csdn.net/weixin_45525272/article/details/125465207
https://blog.csdn.net/qq_31217363/article/details/126392197
https://blog.csdn.net/Learning_xzj/article/details/125432819