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。
推薦閱讀:
- SpringBoot+Thymeleaf靜態資源的映射規則說明
- 聊聊springboot靜態資源加載的規則
- springboot中的靜態資源加載順序優先級
- SpringBoot 靜態資源導入及首頁設置問題
- SpringBoot通過源碼探究靜態資源的映射規則實現