SpringBoot 如何實時刷新靜態文件

你是否受夠瞭每次修改靜態文件都要重啟服務器?

有時候在一些公司前後端的職責沒有那麼的明確,往往後臺人員也要去寫一些頁面,像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源碼,試一下,一切都很簡單。以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: