1.使用SpringBoot热部署目的

springboot热部署可以让我们在修改代码的时候,不用每次都手动重启应用。
它会自动重启服务,并且比手动重启消耗的时间更少。

2.快速入门

1.引入jar包
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
2.配置Idea

打开File->Settings->Build->Compiler,勾选build project automatically

ideajava代码热更新 idea热更新设置_spring boot


按快捷键Ctrl+Alt+Shift+/ (如果出来Registry…则点击进入),勾选compiler.automake.allow.when.app.running

ideajava代码热更新 idea热更新设置_ideajava代码热更新_02


至此配置完毕。

启动项目后,再修改java文件,项目就会在短时间内自动重启

3.原理介绍

1.devtools会在运行时监控java文件,当文件发生变化时,就会重新编译并重启项目
2.devtools有两个类加载器(classloader),一个叫base classloader,一个叫restart classloader。base classloader负责加载第三方的依赖jar包,restart classloader负责加载我们项目的class文件。
3.当项目重启时,base classloader不会重新加载第三方jar包里的class文件,只有restart classloader会重新加载项目里的class文件,这样的话相比于我们手动重启项目(所有class文件包括第三方jar包都会重新加载)要快很多。

4.idea自动更新配置

在idea启动栏选择edit configurations

ideajava代码热更新 idea热更新设置_重启_03


找到running application update policies一栏,并更改更新策略:

说明:

1.on ‘update’ action表示点击更新操作时触发策略,

2.on frame deactivation表示idea窗口失去焦点时,比如切换到桌面的时候,触发策略。

策略有三种:

1.do nothing:什么都不做

2.update resources:更新resources下的资源文件

3.update classes and resources:更新class文件和resources下的资源文件

ideajava代码热更新 idea热更新设置_spring boot_04


常用配置:

我们可以只把on ‘update’ action的策略改为update classes and resources。

此时如果我们启动项目,则在左下角服务窗口会多出一个小图标,如图:

ideajava代码热更新 idea热更新设置_java_05


于是,我们每次修改代码后,可以点击该按钮,idea就会更新并加载class文件。

5.spring-boot热部署和idea自动更新对比

对比条件

spring-boot-devtools

idea自动更新策略

重启服务


不会

是否自动

修改代码后自动重启加载class文件

需要满足触发条件,例如更新文件或者窗口失去焦点

触发条件

修改代码会触发,改变默认静态资源时不会,不过可以灵活配置

触发条件只有两种,策略只有三种(不过基本满足日常需求)

6.spring-boot热部署灵活配置

1.排除resources

默认情况下,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的资源不会触发重启,而是触发live reload(稍后介绍)。
如果还有一些个性化文件我们也不想让它触发重启,则可以在配置文件中加上spring.devtools.restart.exclude参数,例如

spring.devtools.restart.exclude=static/**, public/**

2.监视其他路径

如果我们想要指定路径加入监控,可以利用参数spring.devtools.restart.additionalpaths,配置方法和上面一样

3.使用触发文件

若不想每次修改都触发自动重启,可以设置spring.devtools.restart.trigger-file指向某个文件,只有更改这个文件时才触发自动重启。

4.Live Reload

Devtools模块包含一个嵌入的LiveReload服务器,可以在资源变化时用来触发浏览器刷新。浏览器需要在livereload.com下载安装扩展。