Spring Boot 整合 DevTools ,實作類檔案和靜态資源檔案的熱部署,隻需要添加
spring-boot-devtools
依賴就可以輕松實作。
1 自動編譯配置
在 Eclipse 中檔案修改後,儲存就會自動編譯,但在 IDEA 中沒有顯示的檔案儲存操作,是以預設情況下檔案修改後不會自動編譯,需要手動編譯(快捷鍵:
Ctrl + F9
),進而觸發項目自動重新開機。當然我們可以通過配置來實作 IDEA 中檔案修改後的自動編譯(可能會比較耗電腦資源),如下:
開啟自動編譯:
Registry 配置(快捷鍵:
Ctrl + Shift + Alt + /
):
注意:在 Maven 項目的子 Module 内自動編譯和自動重新開機貌似無效?
2 建立項目
建立 Spring Boot 項目
spring-boot-devtools
,添加
Web/DevTools
依賴,最終的依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3 類檔案熱部署
DevTools 針對類檔案的熱部署,主要由兩個不同的 classloader 實作:
base classloader
和
restart classloader
。其中 base classloader 用來加載那些不會變化的類,例如各種第三方依賴。而 restart classloader 則用來加載那些會發生變化的類,例如你自己寫的代碼。 Spring Boot 中熱部署的原理就是當類檔案發生變化時, base classloader 不變,而 restart classloader 則會被廢棄,被另一個新的 restart classloader 代替。在整個過程中,因為隻重新加載了變化的類,是以啟動速度要比整個項目啟動要快。
建立
HelloController
測試類,如下:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello DevTools";
}
}
項目啟動之後,通路 http://127.0.0.1:8080/hello ,接着修改内容,稍等一會觀察控制台會發現類檔案自動編譯,且項目自動重新開機了,重新整理頁面後發現修改的内容也生效了。如果沒有自動重新開機,可以嘗試按一下
Ctrl + S
或切換一下視圖離開 IDEA ,應該就會自動重新開機了。
4 靜态資源檔案熱部署
4.1 配置項目自動重新開機(技術上可行)
在使用 DevTools 時,預設情況下當靜态資源檔案發生變化時,并不會觸發項目自動重新開機,當然我們可以通過配置來實作(實際上沒必要),有兩種方式,如下:
# 配置 static 目錄下的檔案變化後(前提要手動/自動編譯),觸發項目自動重新開機
# 方式1
spring.devtools.restart.exclude=classpath:/static/**
# 方式2
# spring.devtools.restart.additional-paths=src/main/resources/static
在
src/main/resources/static
目錄下新增
index.html
,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 style="color: #ff1a0e;">hello devtools!</h1>
</body>
</html>
項目啟動之後,通路 http://127.0.0.1:8080/index.html ,接着修改 index.html 的内容,稍等一會觀察控制台會發現項目自動重新開機了,重新整理頁面後發現修改的内容也生效了。如果沒有自動重新開機,可以嘗試按一下
Ctrl + S
或切換一下視圖離開 IDEA ,應該就會自動重新開機了。
雖然技術上我們可以通過配置解決這一問題,但是沒有必要。因為靜态資源檔案發生變化後不需要編譯,按理說儲存後重新整理下就可以通路到了。那麼如何才能實作靜态資源檔案發生變化時,不編譯就能自動重新整理呢? LiveReload
可以幫助我們實作這一功能。
4.2 LiveReload 實作頁面自動重新整理(推薦)
DevTools 中預設嵌入了 LiveReload 伺服器, LiveReload 可以在靜态資源檔案發生變化時自動觸發浏覽器頁面重新整理, LiveReload 支援 Chrome、Firefox 以及 Safari 。以 Chrome 為例,在 Chrome 應用商店搜尋 LiveReload 并添加到 Chrome 中(也可以通過離線安裝),添加成功後,在 Chrome 右上角有一個 LiveReload 圖示。
首先,注釋掉上面關于靜态資源檔案觸發項目自動重新開機的配置,如下:
# 配置 static 目錄下的檔案變化後(前提要手動/自動編譯),觸發項目自動重新開機
# 方式1
# spring.devtools.restart.exclude=classpath:/static/**
# 方式2
# spring.devtools.restart.additional-paths=src/main/resources/static
項目啟動之後,通路 http://127.0.0.1:8080/index.html ,并在目前頁面開啟 LiveReload 。注意: LiveReload 是和浏覽器的頁籤綁定在一起的,在哪個頁籤中開啟了 LiveReload,就在哪個頁籤中通路頁面,這樣才有效果。
接着修改下 index.html 的内容,回到浏覽器,不用做任何操作,就會發現浏覽器自動重新整理了,頁面已經更新了,整個過程中項目并沒有重新開機。
LiveReload 預設是開啟的,我們可以通過配置禁用 LiveReload ,如下:
# 禁用 LiveReload
spring.devtools.livereload.enabled=false
5 其他配置
5.1 手動控制自動重新開機功能
預設情況下, DevTools 中的自動重新開機功能是由它自己控制的,每次檔案變化都會觸發。實際上沒必要這麼頻繁,一般我們是在完成一個功能後才需要重新開機。下面通過配置來實作手動控制自動重新開機,有兩種方式,如下:
- 方式1:項目配置檔案
# 手動控制自動重新開機功能:項目檔案變化,且 .trigger-file 檔案變化,則項目自動重新開機
spring.devtools.restart.trigger-file=.trigger-file
- 方式2:全局配置
在目前使用者目錄下建立
.spring-boot-devtools.properties
檔案,如下:
spring.devtools.restart.trigger-file=.trigger-file
最後在
src/main/resources
目錄下建立
.trigger-file
檔案,當每次完成一個功能後,手動修改下這個檔案(内容随意),項目才會自動重新開機。
5.2 關閉自動重新開機功能
引入了 spring-boot-devtools 依賴後,項目的自動重新開機功能預設是啟用的,我們可以通過配置來關閉該功能,有兩種方式,如下:
- 方式1:配置檔案
# 方式1:關閉自動重新開機功能
spring.devtools.restart.enabled=false
- 方式2:啟動類
@SpringBootApplication
public class SpringBootDevtoolsApplication {
public static void main(String[] args) {
// 方式2:關閉自動重新開機功能
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(SpringBootDevtoolsApplication.class, args);
}
}
- Spring Boot 教程合集(微信左下方閱讀全文可直達)。
- Spring Boot 教程合集示例代碼:https://github.com/cxy35/spring-boot-samples
- 本文示例代碼:https://github.com/cxy35/spring-boot-samples/tree/master/spring-boot-devtools
掃碼關注微信公衆号 程式員35 ,擷取最新技術幹貨,暢聊 #程式員的35,35的程式員# 。獨立站點:https://cxy35.com