SpringBoot 如何实时刷新静态文件
作者:weixin_34129145 发布时间:2023-11-02 13:27:09
你是否受够了每次修改静态文件都要重启服务器?
有时候在一些公司前后端的职责没有那么的明确,往往后台人员也要去写一些页面,像jsp页面,或者其他的后台模板页面等。默认情况下Java文件会被编译为class文件,并且静态资源文件也被一并的编译进class目录下面,这样导致我们每次修改静态文件都要重新编译进class目录,很麻烦,有没有什么简便的方案呢?
方案
Spring Boot在MVC中有个WebMvcProperties的配置类,还有个ResourceProperties资源配置类。
默认情况下Spring Boot从下面的目录下寻找静态资源文件
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
默认的静态资源路径匹配为/**。
修改Spring Boot配置,注意static-locations为静态资源在自己电脑中的绝对路径配置
spirng
resources:
chain:
cache: false
static-locations: file:///Users/aihe/Desktop/taqu/ticket-system/src/main/resources/static/,file:///Users/aihe/Desktop/taqu/ticket-system/src/main/resources/
mvc:
static-path-pattern: /static/**
以后再修改静态文件的时候,js,html,css等即可立即生效,也不需要热部署的插件什么的。算是一个小tip吧~
SpringBoot静态资源不重启刷新,自定义配置
经常做Spring Boot开发,有很多时候不需要前后端分离,比如后管系统。开发的时候每次修改页面就需要重启,极度不方便。其实Spring Boot设计是不需要重启的,只是我们没注意用法而已。
1. demo
pom & main
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
</dependencies>
@SpringBootApplication
public class BootMain {
public static void main(String[] args) {
SpringApplication.run(BootMain.class, args);
}
}
静态资源文件,查询官方docs文档放在"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"任意目录,即可加载
启动main,访问http://localhost:8082/index.html,笔者自定义了端口
2. 如何不重启修改生效
其实很简单,Spring Boot生效的目录在target目录,并非我们的resource目录
Spring Boot只认target,我们修改的resources怎么会自动编译target呢,所以要重启了!?
解决方法有很多,常见的有mvn compile即可,或者自动编译(不推荐,因为资源文件,java也会编译),其实有一种非常简单的方法
每次修改后,右键,recompile即可,我已经修改了,来试试
生效了,?
3. 原理
了解原理有利于我们自定义Spring Boot,从根源上来使用它
可以看到,静态资源加载的代码是
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/")
里面的参数请自动忽略,因为我们可以自定义
这是为什么很多教程说自定义这个方法即可,不重启刷新静态资源,因为教程是指定了资源文件的路径,编译后的路径就是资源路径
常用的自定义spring.mvc.staticPathPattern = "/**",默认/**,配置pattern,url的路径参数
@ConfigurationProperties(prefix = "spring.mvc")
public class WebMvcProperties {
private String staticPathPattern = "/**";
spring.resources.staticLocations = classpath:/html/,默认如下,这是Spring Boot默认配置的的路径
@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
/**
* Locations of static resources. Defaults to classpath:[/META-INF/resources/,
* /resources/, /static/, /public/].
*/
private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
小结一下
遇到很多问题,不能人云亦云,百度啥的,其实很简单,看一下Spring源码,试一下,一切都很简单。以上为个人经验,希望能给大家一个参考。
来源:https://blog.csdn.net/weixin_34129145/article/details/89579952
猜你喜欢
- SpringBoot 2.1.4 错误处理机制springboot的自动配置中帮我们配置了相关的错误处理组件,例如访问一个不存在的页面,就会
- using System; using System.Collections.Generic; using System.Text; usi
- [LeetCode] 205. Isomorphic Strings 同构字符串Given two strings s
- 自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以
- springboot嵌套子类使用在实际项目里,我们会使用到一个User用户含有子类Address、这种嵌套子类在开发中会遇到很多问题,现在主
- Java 本身就自带 JS 引擎,自从 Java 1.6 开始就支持了,愈来愈好。我对 js 比较熟悉,因此有个大胆的想法,为什么不用自带
- 参考:How to catch an Exception from a threadIs there a way to make Runna
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- 一、Flutter代码的启动起点我们在多数的业务场景下,使用的都是FlutterActivity、FlutterFragment。在在背后,
- 本文实例为大家分享了C# GDI+实现时钟表盘的具体代码,供大家参考,具体内容如下一、设计如下图界面按键“打开时钟&am
- 合并有序数组的实现java版本:实例代码public class Merge {//合并有序数组 public static v
- 本文实例讲述了java实现的简单猜数字游戏代码。分享给大家供大家参考。具体代码如下:import java.util.InputMismat
- 什么是OKHttp一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进
- File 类:文件和目录路径名的抽象表示。注意:File 类只能操作文件的属性,文件的内容是不能操作的。1、File 类的字段我们知道,各个
- 做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用
- 多数据源创建数据库CREATE DATABASE mybatis_plus_1;USE mybatis_plus_1;CREATE TABL
- #include <stdio.h>#include <stdlib.h>int main(){ &nbs
- Java 判断字符串中是否包含中文的实例详解 Java判断一个字符串是否有中文是利用Unicode编码来判断,因为中
- 用java实现循环队列的方法:1、添加一个属性size用来记录眼下的元素个数。目的是当head=rear的时候。通过size=0还是size
- 先上图下拉刷新跟原生开发一样,下拉刷新在flutter里提供的有组件实现 RefreshIndicator一直不明白为啥组件中都提供下拉刷新