SpringBoot在idea中设置自动更新类和静态资源

一、Java类

使用spring-boot-devtools的应用程序将在类路径上的文件发生更改时自动重新启动。

在pom.xml文件中加入一下依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
     <scope>runtime</scope>
     <optional>true</optional>
</dependency></pre>

这里多了一个optional,为true表示项目在打包的时候不会被打包进项目中。
此时,只要classpath下的文件发生了变化,项目就会自动重启,这极大的提高了项目的开发速度
要是项目自动编译,idea还需做一些简单的配置,打开Settings——Compiler。

配置项目自动Build

然后按住CTRL+SHIFT+ALT+/,调出如下页面:选择第一个

image

然后找到如下,并勾选:

配置运行时自动构建

重启IDEA,这是你就可以使用devtools来自动构建项目了。

二、静态资源

devtools 中默认嵌入了 LiveReload 服务器,利用 LiveReload 可以实现静态文件的热部署,LiveReload 可以在资源发生变化时自动触发浏览器更新,LiveReload 支持 Chrome、Firefox 以及 Safari 。

需要先在浏览器中安装LiveReload插件,安装过程自行百度,安装好之后:

然后在pom.xml中添加依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <scope>runtime</scope>
   <optional>true</optional>
</dependency>

配合thymeleaf和livereload随时加载静态资源和自动刷新页面,首先要在开发时禁用掉缓存cache,同时将livereload设为可用。

在application.properties使用如下配置:

spring.thymeleaf.cache=false
spring.devtools.livereload.enabled=true

或者在application.yml中配置为:

spring:
  # thymeleaf
  thymeleaf:
    # 关闭缓存
    cache: false
  devtools:
    livereload:
      enabled: true

然后启动项目,需要观察控制台是否输出LiveReload服务启动成功:

输出 Unable to start LiveReload server,表示启动失败,主要是LiveReload服务端口35729被占用,关闭即可。
输出 LiveReload sever is running on port 35729,则表示启动成功。


启动结果

测试的话随便打开一个html页面,然后点击浏览器右上角的 LiveReload 按钮,打开 LiveReload 连接。这时修改html中的内容后浏览器就会自动刷新,不需要手动保存然后刷新,而整个项目并没有重启。

三、备注

1. 原理

SpringBoot中提供了热部署插件spring-boot-devtools来提高开发效率,他的原理其实就是两个类加载器:

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

注意:如果是编辑器是intellij IDEA,需要配置为自动重建:

在On Update action中选择Update trigger file,在调用Update操作时触发DevTools的Restart;甚至可以选择尝试热插拔的选项,并仅在热插拔失败时使用DevTools重新启动。在On frame deactivation中选择Update classes and resources,在IDEA窗口失去焦点时重新加载所有静态资源和模板(例如,切换到浏览器窗口时):

确认后,修改源码,切换到浏览器,刷新浏览器,可以看到更新后的结果,如果还不行按(Ctrl + F10)强行更新重启。

2. LiveReload注意事项

LiveReload 是和浏览器选项卡绑定在一起的,在哪个选项卡中打开了 LiveReload,就在哪个选项卡中访问页面,这样才有效果。
如果安装并且启动了 LiveReload 插件,同时也添加了 devtools 依赖,但是却并不想当静态页面发生变化时浏览器自动刷新,那么可以关闭插件连接,或者在 application.properties 中添加如下代码进行配置:

spring.devtools.livereload.enabled=false

建议开发者使用 LiveReload 策略而不是项目重启策略来实现静态资源的动态加载,因为项目重启所耗费时间一般来说要超过使用LiveReload 所耗费的时间。
Spring Boot DevTools的用法仅用于开发,而不用于生产。如果应用程序检测到生产中运行,则会自动禁用DevTools。部署时有两种模式:fully packaged artifact完全打包和exploded artifact ;采取前者打包方式Spring会认为是生产应用;后者认为是开发模式,在Idea等IDE中采取的是后者。
使用DevTools的Spring应用程序会自动启动LiveReload服务器。不幸的是,此服务器中只有一个实例可以同时运行。更确切地说,只有第一个可行。
DevTools通常应该正常运行,但它可能与第三方库有冲突。已知的是使用标准ObjectInputStream进行反序列化时可能存在冲突。如果发生此类冲突,可以通过设置禁用自动重启:

spring.devtools.restart.enabled=false

但是,仍将使用重新启动类加载器restart classloader。如果需要完全禁用类加载器,则需要在启动应用程序之前执行此操作:

public static void main(String args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

参考文章:
Spring/SpringBoot系列之SpringBoot使用spring-boot-devtools实现后端热部署、前端自动刷新(热部署)【十七】:https://blog.csdn.net/fei1234456/article/details/106853339

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容