天天看點

Spring Boot 整合 DevTools(實作熱部署)

Spring Boot 整合 DevTools ,實作類檔案和靜态資源檔案的熱部署,隻需要添加

spring-boot-devtools

依賴就可以輕松實作。

1 自動編譯配置

在 Eclipse 中檔案修改後,儲存就會自動編譯,但在 IDEA 中沒有顯示的檔案儲存操作,是以預設情況下檔案修改後不會自動編譯,需要手動編譯(快捷鍵:

Ctrl + F9

),進而觸發項目自動重新開機。當然我們可以通過配置來實作 IDEA 中檔案修改後的自動編譯(可能會比較耗電腦資源),如下:

開啟自動編譯:

Spring Boot 整合 DevTools(實作熱部署)

Registry 配置(快捷鍵:

Ctrl + Shift + Alt + /

):

Spring Boot 整合 DevTools(實作熱部署)
Spring Boot 整合 DevTools(實作熱部署)

注意:在 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

Spring Boot 整合 DevTools(實作熱部署)

繼續閱讀