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
按快捷键Ctrl+Alt+Shift+/ (如果出来Registry…则点击进入),勾选compiler.automake.allow.when.app.running
至此配置完毕。
启动项目后,再修改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
找到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下的资源文件
常用配置:
我们可以只把on ‘update’ action的策略改为update classes and resources。
此时如果我们启动项目,则在左下角服务窗口会多出一个小图标,如图:
于是,我们每次修改代码后,可以点击该按钮,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下载安装扩展。