Springboot 实现热部署

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

posted on 2022-12-17 23:45  铃之森  阅读(383)  评论(0编辑  收藏  举报

导航