天天看点

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

Spring Boot 整合 DevTools ,实现类文件和静态资源文件的热部署,只需要添加

spring-boot-devtools

依赖就可以轻松实现。

1 自动编译配置

在 Eclipse 中文件修改后,保存就会自动编译,但在 IDEA 中没有显示的文件保存操作,因此默认情况下文件修改后不会自动编译,需要手动编译(快捷键:

Ctrl + F9

),从而触发项目自动重启。当然我们可以通过配置来实现 IDEA 中文件修改后的自动编译(可能会比较耗电脑资源),如下:

开启自动编译:

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

Registry 配置(快捷键:

Ctrl + Shift + Alt + /

):

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

注意:在 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 classloader

restart 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);
    }
}
           
  • Spring Boot 教程合集(微信左下方阅读全文可直达)。
  • Spring Boot 教程合集示例代码:https://github.com/cxy35/spring-boot-samples
  • 本文示例代码:https://github.com/cxy35/spring-boot-samples/tree/master/spring-boot-devtools

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

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

继续阅读