前言

在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果。这种开发体验无疑是很差的,Springboot为我们提供了devtools来帮助我们实现热更新。

使用springboot提供的spring-boot-devtools

添加devtools依赖

1
2
3
4
5
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>

springboot maven插件配置

1
2
3
4
5
6
7
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
      <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
    </configuration>
</plugin>

application.properties配置

1
2
3
4
5
6
7
8
9
#热部署生效
spring.devtools.restart.enabled=true
#设置重启的目录
spring.devtools.restart.additional-paths=src/main/java
#classpath目录下的resources文件夹内容修改不重启
spring.devtools.restart.exclude=src/main/resources

# 禁用缓存(开发阶段)
spring.thymeleaf.cache=false

打开idea的自动make功能

查找Registry –> 找到并勾选compiler.automake.allow.when.app.running

网上都是快捷键CTRL + SHIFT + A,如果不生效,在keymap中搜索registry,然后设置快捷键即可。

页面修改自动加载

在application.properties中禁用了缓存后,在浏览器禁用缓存。

页面有修改就会自动加载。

启动

直接运行springboot主类即可。

class只要有变动就会重启,springboot实现了自己的类加载器,该加载器加载自己写的类,另外一个加载器加载第三方的依赖。重启的时候只重启自己写的类,所以速度很快。

通过.trigger文件来触发更新

上面的配置,只要文件有修改就会触发更新。有2个问题:

  • 如果电脑配置较差,那么就会比较卡顿;
  • 由于idea是自动保存的,可能你文件还没有修改好,这个时候重启其实是不必要的。

所以,基于上面的原因,可以通过trigger来触发。

在application.properties中增加如下配置:

1
2
3
4
spring:
  devtools:
    restart:
      trigger-file: .trigger

在resources目录下新建META-INF目录,在该目录下创建.trigger文件,文件内容为空。
如果要触发更新,就随便修改.trigger文件即可。

在idea集成的tomcat中运行Springboot

pom.xml中打包类型修改为war

1
<packaging>war</packaging>

maven添加spring-boot-starter-tomcat依赖

1
2
3
4
5
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>

应用启动类修改

1
2
3
4
5
6
7
8
9
10
11
12
13
@SpringBootApplication
public class App extends SpringBootServletInitializer
{
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder application) {
        return application.sources(App.class);
    }
    public static void main( String[] args )
    {
        SpringApplication.run(App.class,args);
    }
}

继承SpringBootServletInitializer,重写configure方法。

部署

跟常规的idea的web项目一样即可。如图:

后续页面、资源文件、class等修改都跟常规的idea的web项目一样操作即可。这样class只要没有增加类、方法、修改签名等就不用重启tomcat了。

注意:我发现有时候没法触发自动重启,手动触发一下编译即可(idea中快捷键ctrl+F9)。

参考

常用热部署方式

参考:https://www.cnblogs.com/winner-0715/p/6666579.html