Spring Boot 整合 DevTools(实现热部署)

Spring Boot 整合 DevTools ,实现类文件和静态资源文件的热部署,只需要添加 spring-boot-devtools 依赖就可以轻松实现。

1 自动编译配置

在 Eclipse 中文件修改后,保存就会自动编译,但在 IDEA 中没有显示的文件保存操作,因此默认情况下文件修改后不会自动编译,需要手动编译(快捷键: Ctrl + F9 ),从而触发项目自动重启。当然我们可以通过配置来实现 IDEA 中文件修改后的自动编译(可能会比较耗电脑资源),如下:

开启自动编译:

Registry 配置(快捷键: Ctrl + Shift + Alt + / ):

注意:在 Maven 项目的子 Module 内自动编译和自动重启貌似无效?

2 创建项目

创建 Spring Boot 项目 spring-boot-devtools ,添加 Web/DevTools 依赖,最终的依赖如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

3 类文件热部署

DevTools 针对类文件的热部署,主要由两个不同的 classloader 实现: base classloaderrestart classloader 。其中 base classloader 用来加载那些不会变化的类,例如各种第三方依赖。而 restart classloader 则用来加载那些会发生变化的类,例如你自己写的代码。 Spring Boot 中热部署的原理就是当类文件发生变化时, base classloader 不变,而 restart classloader 则会被废弃,被另一个新的 restart classloader 代替。在整个过程中,因为只重新加载了变化的类,所以启动速度要比整个项目启动要快。

新建 HelloController 测试类,如下:

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String  hello() {
        return "Hello DevTools";
    }
}

项目启动之后,访问 http://127.0.0.1:8080/hello ,接着修改内容,稍等一会观察控制台会发现类文件自动编译,且项目自动重启了,刷新页面后发现修改的内容也生效了。如果没有自动重启,可以尝试按一下 Ctrl + S 或切换一下视图离开 IDEA ,应该就会自动重启了。

4 静态资源文件热部署

4.1 配置项目自动重启(技术上可行)

在使用 DevTools 时,默认情况下当静态资源文件发生变化时,并不会触发项目自动重启,当然我们可以通过配置来实现(实际上没必要),有两种方式,如下:

# 配置 static 目录下的文件变化后(前提要手动/自动编译),触发项目自动重启
# 方式1
spring.devtools.restart.exclude=classpath:/static/**
# 方式2
# spring.devtools.restart.additional-paths=src/main/resources/static

src/main/resources/static 目录下新增 index.html ,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 style="color: #ff1a0e;">hello devtools!</h1>
</body>
</html>

项目启动之后,访问 http://127.0.0.1:8080/index.html ,接着修改 index.html 的内容,稍等一会观察控制台会发现项目自动重启了,刷新页面后发现修改的内容也生效了。如果没有自动重启,可以尝试按一下 Ctrl + S 或切换一下视图离开 IDEA ,应该就会自动重启了。


虽然技术上我们可以通过配置解决这一问题,但是没有必要。因为静态资源文件发生变化后不需要编译,按理说保存后刷新下就可以访问到了。那么如何才能实现静态资源文件发生变化时,不编译就能自动刷新呢? LiveReload 可以帮助我们实现这一功能。

4.2 LiveReload 实现页面自动刷新(推荐)

DevTools 中默认嵌入了 LiveReload 服务器, LiveReload 可以在静态资源文件发生变化时自动触发浏览器页面刷新, LiveReload 支持 Chrome、Firefox 以及 Safari 。以 Chrome 为例,在 Chrome 应用商店搜索 LiveReload 并添加到 Chrome 中(也可以通过离线安装),添加成功后,在 Chrome 右上角有一个 LiveReload 图标。

首先,注释掉上面关于静态资源文件触发项目自动重启的配置,如下:

# 配置 static 目录下的文件变化后(前提要手动/自动编译),触发项目自动重启
# 方式1
# spring.devtools.restart.exclude=classpath:/static/**
# 方式2
# spring.devtools.restart.additional-paths=src/main/resources/static

项目启动之后,访问 http://127.0.0.1:8080/index.html ,并在当前页面开启 LiveReload 。注意: LiveReload 是和浏览器的选项卡绑定在一起的,在哪个选项卡中开启了 LiveReload,就在哪个选项卡中访问页面,这样才有效果

接着修改下 index.html 的内容,回到浏览器,不用做任何操作,就会发现浏览器自动刷新了,页面已经更新了,整个过程中项目并没有重启


LiveReload 默认是开启的,我们可以通过配置禁用 LiveReload ,如下:

# 禁用 LiveReload
spring.devtools.livereload.enabled=false

5 其他配置

5.1 手动控制自动重启功能

默认情况下, DevTools 中的自动重启功能是由它自己控制的,每次文件变化都会触发。实际上没必要这么频繁,一般我们是在完成一个功能后才需要重启。下面通过配置来实现手动控制自动重启,有两种方式,如下:

  • 方式1:项目配置文件
# 手动控制自动重启功能:项目文件变化,且 .trigger-file 文件变化,则项目自动重启
spring.devtools.restart.trigger-file=.trigger-file
  • 方式2:全局配置

在当前用户目录下新建 .spring-boot-devtools.properties 文件,如下:

spring.devtools.restart.trigger-file=.trigger-file

最后在 src/main/resources 目录下新建 .trigger-file 文件,当每次完成一个功能后,手动修改下这个文件(内容随意),项目才会自动重启。

5.2 关闭自动重启功能

引入了 spring-boot-devtools 依赖后,项目的自动重启功能默认是启用的,我们可以通过配置来关闭该功能,有两种方式,如下:

  • 方式1:配置文件
# 方式1:关闭自动重启功能
spring.devtools.restart.enabled=false
  • 方式2:启动类
@SpringBootApplication
public class SpringBootDevtoolsApplication {

    public static void main(String[] args) {
        // 方式2:关闭自动重启功能
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(SpringBootDevtoolsApplication.class, args);
    }
}


扫码关注微信公众号 程序员35 ,获取最新技术干货,畅聊 #程序员的35,35的程序员# 。独立站点:https://cxy35.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值