Spring Boot開發者工具:自動重啟、LiveReload、遠端開發、預設的開發時屬性值

無敵天驕發表於2021-03-27

Spring Boot 1.3引入了一組新的開發者工具,可以讓你在開發時更方便地使用Spring Boot,包括如下功能。

  • 自動重啟:當 Classpath裡的檔案發生變化時,自動重啟執行中的應用程式。
  • LiveReload支援:對資源的修改自動觸發瀏覽器重新整理。
  • 遠端開發:遠端部署時支援自動重啟和 LiveReload
  • 預設的開發時屬性值:為一些屬性提供有意義的預設開發時屬性值。

Spring Boot的開發者工具採取了庫的形式,可以作為依賴加入專案。如果你使用Gradle來構建專案,可以像下面這樣在 build.gradle檔案裡新增開發工具:

compile "org.springframework.boot:spring-boot-devtools"

在Maven POM裡新增 <dependency>是這樣的:

<dependency> 
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-devtools</artifactId> </dependency>

當應用程式以完整打包好的JAR或WAR檔案形式執行時,開發者工具會被禁用,所以沒有必要在構建生產部署包前移除這個依賴。

一、自動重啟

在啟用了開發者工具後, Classpath裡對檔案做任何修改都會觸發應用程式重啟。為了讓重啟速度夠快,不會修改的類(比如第三方JAR檔案裡的類)都載入到了基礎類載入器裡,而應用程式的程式碼則會載入到一個單獨的重啟類載入器裡。檢測到變更時,只有重啟類載入器重啟。

有些Classpath裡的資源變更後不需要重啟應用程式。像Thymeleaf這樣的檢視模板可以直接編輯,不用重啟應用程式。在/static或/public裡的靜態資源也不用重啟應用程式,所以Spring Boot 開發者工具會在重啟時排除掉如下目錄: /META-INF/resources/resources/static/public和  /templates

可以設定 spring.devtools.restart.exclude屬性來覆蓋預設的重啟排除目錄。例如,你只排除 /static/templates目錄,可以像這樣設定 spring.devtools.restart. exclude

spring: 
 devtools: 
 restart: 
 exclude: /static/**,/templates/**

另一方面,如果想徹底關閉自動重啟,可以將 spring.devtools.restart.enabled設定為false:

spring: 
 devtools: 
 restart: 
 enabled: false

另外,還可以設定一個觸發檔案,必須修改這個檔案才能觸發重啟。例如,在修改為.trigger 的檔案前你都不希望執行重啟,那麼你只需像這樣設定 spring.devtools.restart.trigger-file屬性:

spring: 
 devtools: 
 restart: 
 trigger-file: .trigger

如果你的IDE會連續編譯修改的檔案,那觸發檔案還是很有用的。沒有觸發檔案的話,每次變更都會觸發重啟。有觸發檔案,就能保證只有你想重啟時才會發生重啟(修改觸發檔案即可)。

二、LiveReload

在Web應用程式開發過程中,最常見的步驟大致如下:

  • 修改要呈現的內容(比如圖片、樣式表、模板)。
  • 點選瀏覽器裡的重新整理按鈕,檢視修改的結果。
  • 回到第1步。

雖然這並不難,但如果能不點重新整理就直接看到修改結果,那豈不是更好?

Spring Boot的開發者工具整合了 LiveReload(),可以消除重新整理的步驟。啟用開發者工具後,Spring Boot會啟動一個內嵌的 LiveReload伺服器,在資原始檔變化時會觸發瀏覽器重新整理。你要做的就是在瀏覽器裡安裝 LiveReload外掛。

如果想要禁用內嵌的  LiveReload 伺服器,可以將  spring.devtools.livereload. enabled設定為false:

spring: 
 devtools: 
 livereload: 
 enabled: false

三、遠端開發

在遠端執行應用程式時(比如部署到伺服器上或雲上),開發者工具的自動重啟和 LiveReload特性都是可選的。此外,Spring Boot開發者工具還能遠端除錯Spring Boot應用程式。

在傳統的開發過程中,你不會開啟遠端開發功能,因為這會影響效能。但在一些特殊的場景中,此類工具就很有用。比如,出於開發目的,所開發的應用程式部署在非生產環境裡。如果應用程式不是在本地開發環境裡,而是在雲端部署,則尤其如此。

你必須設定一個遠端安全碼來開啟遠端開發功能:

spring: 
 devtools: 
 remote: 
 secret: myappsecret

有了這個屬性後,執行中的應用程式就會啟動一個伺服器元件以支援遠端開發。它會監聽接受變更的請求,可以重啟應用程式或者觸發瀏覽器重新整理。

為了使用這個遠端伺服器,你需要在本地執行遠端開發工具的客戶端。這個遠端客戶端是一個類,全限定類名是 org.springframework.boot.devtools.RemoteSpringApplication。它會執行在IDE裡,要求提供一個引數,告知遠端應用程式部署在哪裡。

例如,假設你正遠端執行閱讀列表應用程式,部署在  Cloud Foundry 上,地址是  readinglist.cfapps.io 。如果你正在使用Eclipse或Spring ToolSuite,可以透過如下步驟開啟遠端客戶端。

  1. 選擇Run > Run Configurations選單項。
  2. 建立一個新的Java Application執行配置。
  3. 在Project裡選中Reading List專案(可以鍵入專案名或者點選Browse按鈕找到這個專案,見圖A-1)。
  4. 在Main Class裡鍵入 org.springframework.boot.devtools.RemoteSpringAppli-cation(見圖A-1)。
  5. 切換到Arguments標籤頁,在 Program Arguments裡鍵入 readinglist.cfapps . io(見圖A-2)。

Spring Boot開發者工具:自動重啟、LiveReload、遠端開發、預設的開發時屬性值 Spring Boot開發者工具:自動重啟、LiveReload、遠端開發、預設的開發時屬性值

客戶端啟動後,就可以在IDE裡修改應用程式了。在檢測到變動後,這些修改點會被推送到遠端並加以應用。如果修改的內容涉及呈現的Web資源(比如樣式表或JavaScript), LiveReload 還會觸發瀏覽器重新整理。

遠端客戶端還會開啟基於HTTP的遠端除錯通道,這樣就能在IDE裡除錯部署在遠端的應用程式了。你要做的就是確保遠端應用程式開啟了遠端除錯功能。這通常可以透過配置JAVA_OPTS來實現。

比方說,你的應用程式部署在Cloud Foundry上,可以像下面這樣在應用程式的 manifest.yml裡設定JAVA_OPTS。

---
 env: 
  JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"

遠端應用程式啟動後,會和本地除錯伺服器建立一個連線。你可以設定斷點,一步步執行遠端應用程式裡的程式碼,就好像它們執行在本地一樣(出於網路原因,速度會有點慢)。

四、預設的開發時屬性

有些配置屬性通常在開發時設定,從來不用在生產環境裡。比如檢視模板快取,在開發時最好關掉,這樣你可以立刻看到修改的結果。但在生產環境裡,為了追求更好的效能,應該開啟檢視模版快取。

預設情況下,Spring Boot會為其支援的各種檢視模板( ThymeleafFreemarkerVelocityMustacheGroovy模板)開啟快取選項。但如果存在Spring Boot的開發者工具,這些快取就會禁用。

實際上,這就是說在開發者工具啟用後,如下屬性會設定為false:

  • spring.thymeleaf.cache
  • spring.freemarker.cache
  • spring.velocity.cache
  • spring.mustache.cache
  • spring.groovy.template.cache

這樣一來,就不用在開發時(在一個開發時使用的Profile配置裡)禁用它們了。

五、全域性配置開發者工具

你應該已經注意到了,在使用開發者工具時,你通常會在多個專案裡使用相同的設定。舉個例子,如果你使用了重啟觸發檔案,那麼你很可能在多個專案裡都使用相同的觸發檔名。相比在每個專案裡重複開發者工具配置,對開發者工具做全域性配置顯得更方便一些。

要實現這個目的,可以在你的主目錄( home directory)裡建立一個名為 .spring-boot-devtools. properties的檔案。(請注意,檔名用“.”開頭。)在那個檔案裡,你可以設定希望在多個專案裡共享的各種開發者工具屬性。

例如,假設你想把觸發檔案的名稱設定為.trigger,在所有Spring Boot專案裡禁用 LiveReload。你可以建立一個 .spring-boot-devtools.properties檔案,包含如下內容:

spring.devtools.restart.trigger-file=.trigger spring.devtools.livereload.enabled=false

要是你想覆蓋這些配置,可以在每個專案的 application.propertiesapplication.yml檔案裡設定特定於每個專案的屬性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2765272/,如需轉載,請註明出處,否則將追究法律責任。

相關文章