SpringBoot入门-配置热部署devtools工具

一、什么是热部署和热加载?

热部署和热加载是在应用正在运行的时候,自动更新(重新加载或者替换class等)应用的一种能力。
(PS:spring-boot-devtools提供的方案也是要重启的,只是无需手动重启能实现自动加载而已。)
严格意义上,我们需要区分下热部署和热加载, 对于Java项目而言:

1、热部署

  • 在服务器运行时重新部署项目。
  • 它是直接重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。

2、热加载

  • 在运行时重新加载class,从而升级应用。
  • 热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。
  • 对比反射机制,反射是在运行时获取类信息,通过动态的调用来改变程序行为; 热加载则是在运行时通过重新加载改变类信息,直接改变程序行为。

二、什么是LiveLoad?

LiveLoad是提供浏览器客户端自动加载更新的工具,分为LiveLoad服务器和Liveload浏览器插件两部分; devtools中已经集成了LiveLoad服务器,所以如果我们开发的是web应用,并且期望浏览器自动刷新, 这时候可以考虑LiveLoad。
同一时间只能运行一个LiveReload服务器。 开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。

三、配置devtools实现热部署

1、POM配置

添加spring-boot-devtools的依赖

<!-- 添加spring-boot-devtools的依赖,实现自动重启方式的热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 可以防止将devtools依赖传递到其他模块中 -->
        </dependency>

2、IDEA配置

  • 方式一: 无任何配置时,手动触发重启更新,快捷键Ctrl+F9
  • 方式二: IDEA需开启运行时编译,自动重启更新,File->Setting->Build,Execution,Deployment->Compile,勾选:Make project automatically。
    在这里插入图片描述

3、application.yml配置

# 设置devtools,实现自动重启方式的热部署
  devtools:
    restart:
      enabled: true  #设置开启热部署
      additional-paths: src/main/java #重启目录
      exclude: WEB-INF/**
    thymeleaf:
      cache: false #使用Thymeleaf模板引擎,关闭缓存
    livereload:
      enabled: true

四、devtools的原理

1、两个类加载器ClassLoader

“基本”ClassLoader加载不会发生更改的类(第三方jar包)
“重启”ClassLoader加载会更改的类(自定义的类)。

后台启动一个文件监听线程(File Watcher),监测的目录中的文件发生变动时, 原来的restart ClassLoader被丢弃,将会重新加载新的restart ClassLoader。文件变动后,第三方jar包不再重新加载,只加载自定义的类,加载的类比较少,所以重启比较快

2、注意点

2.1、自动重启会记录日志的记录(在什么情况下重启的日志)

可以通过如下关闭

spring:
  devtools:
    restart:
      log-condition-evaluation-delta: false

2.2、排除一些不需要自动重启的资源

 spring:
  devtools:
    restart:
      exclude: "static/**,public/**"

如果要保留这些默认值并添加其他排除项,请改用该spring.devtools.restart.additional-exclude属性。

2.3、自定义重启类加载器

默认情况下,IDE 中的任何打开项目都使用“重启”类加载器加载,任何常规.jar文件都使用“基本”类加载器加载。
如果你处理一个多模块项目,并且不是每个模块都导入到你的 IDE 中,当未导入IDE中的模块发生变化时也需要重启时,可以创建一个META-INF/spring-devtools.properties文件,自定义重启类加载器要加载的内容。
spring-devtools.properties文件包含以restart.exclude和restart.include为前缀的两个属性。
include元素是应该被拉高到“重启”类加载器的项目,exclude要素是应该向下推入“基本”类加载器的项目。该属性的值是应用于类路径的正则表达式模式,如以下示例所示:

restart:
  exclude:
    companycommonlibs: "/mycorp-common-[\\w\\d-\\.]+\\.jar"
  include:
    projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"

# 五、devtool是否会被打包进Jar?

# 六、devtool为何会默认禁用缓存选项

七、devtool全局配置

将spring-boot-devtools.yml文件添加到$HOME/.config/spring-boot目录可以配置全局 devtools 设置。
添加到文件的任何属性都适用于你机器上使用 devtools 的所有Spring Boot 应用程序。

例如,要将重新启动配置为始终使用触发器文件,你需要将以下属性添加到你的spring-boot-devtools文件中:

spring:
  devtools:
    restart:
      trigger-file: ".reloadtrigger"

八、devtool平替

  • 手动重启
  • 方法内部的修改或者静态资源的修改,在IDEA中是可以通过Rebuild(Ctrl + Shift + F9)进行热更
  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值