天天看點

spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

Jrebel很好用,但是要收費.......

熱部署

監聽到如果有Class檔案改動了,就會建立一個新的ClaassLoader進行加載該檔案,經過一系列的過程,最終将結果呈現在我們眼前

spring-boot-devtools

是一個為開發者服務的一個子產品,其中最重要的功能就是自動将應用代碼更改到最新的App上面去,即在我們改變了一些代碼或者配置檔案的時候,應用可以自動重新開機,這在我們開發的時候,非常有用。

重新啟動 vs 重新加載

Spring Boot提供的重新開機技術通過使用兩個類加載器來工作。

不改變的類(例如來自第三方jar的類)被加載到base classloader中。

我們正在開發的類會加載到restart classloader中。當應用程式重新啟動時,restart classloader将被丢棄并建立一個新類。這種方法意味着應用程式重新開機通常比"cold starts"快得多,因為基類加載器已經可用并且已經被填充。

spring-boot-devtools 使用

maven依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>      
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

yml配置

# Spring
spring:
  devtools:
    restart:
      # 預設為true
      enabled: true      
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

 Idea配置

代碼自動編譯

File --> Settings --> Compiler --> Build Project automatically
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

運作期間自動編譯

Mac使用快捷鍵shift+option+command+/,window上的快捷鍵是Shift+Ctrl+Alt+/,打開Registry,勾選

compiler.automake.allow.when.app.running

spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

通過以上的設定就可以在不重新開機服務的情況下加載html,但如果修改java檔案,服務在幾秒後會自動重新開機,如果不希望服務重新開機需要在application.properties或application.yml中添加spring.devtools.reatart.enable=false

Thymeleaf模闆引擎

如果使用Thymeleaf模闆引擎,需要把模闆預設緩存設定為false
#禁止thymeleaf緩存(建議:開發環境設定為false,生成環境設定為true)
# Spring
spring:
  thymeleaf:
    cache: false      
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

spring-boot-devtools 進階功能

1. 排除資源

某些資源不一定需要在更改時觸發重新啟動。例如,可以就地編輯Thymeleaf模闆。

預設情況下,在改變資源/META-INF/maven,/META-INF/resources,/resources,/static,/public,或 /templates不會觸發重新開機但會觸發 重新加載。可以使用spring.devtools.restart.exclude屬性來自定義排除的資源。例如,要僅排除/static,/public可以設定以下屬性:

spring.devtools.restart.exclude=static/**,public/**      
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

2. 監控其他路徑

如上所述,DevTools監控類路徑資源的變動,但如果我們想更改不在類路徑中的檔案時重新啟動或重新加載應用程式,該怎麼辦呢?這是可以使用spring.devtools.restart.additional-paths屬性來配置其他路徑以監視更改。

# Spring
spring:
  devtools:
    restart:
      # 預設為true
      enabled: true
      #排除那個目錄的檔案不需要restart
      additional-exclude: static/**,public/**
      #添加那個目錄的檔案需要restart
      additional-paths: src/main/java      
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

3. LiveReload

LiveReload在做前端開發的時候,經常會用到。

spring-boot-devtools子產品包含嵌入式LiveReload伺服器,可以在資源更改時用于觸發浏覽器重新整理。 LiveReload浏覽器擴充程式支援Chrome,Firefox和Safari,你可以從livereload.com免費下載下傳。

下面是Chrome的

Remote Live Reload

插件位址。安裝即可擁有這個酷炫的功能。

https://chrome.google.com/webstore/detail/remotelivereload/jlppknnillhjgiengoigajegdpieppei?hl=en-GB      
spring-boot-devtools: 免費的熱部署工具熱部署spring-boot-devtools 使用spring-boot-devtools 進階功能

devtools也會在背景開啟一個LiveReload Server,浏覽器會與這個Server保持着一個長連接配接,當後端有

前端資源

變動的時候,将會通知浏覽器進行重新整理,實作熱部署。

4. 遠端調試

暫時沒用到,後期補充