(12) Spring Boot 使用 Devtools

Albert Hg
learning-from-jhipster
9 min readNov 4, 2020

本篇文章將會介紹如何使用 Devtools,使得在開發的過程中可以減少一些需要手動重複執行編譯的動作,以加快發的速度。

為什麼會這麼說呢?主要的原因還是因為每當我們修改了程式碼後,若想要執行更新過後的程式碼,那勢必得手動停止正在執行的程式,接著再重新編譯、執行一次所編輯過後的程式碼。

在這些重複操作的過程中,我們就浪費掉了很多時間與精力,甚至會因為每次都要重複做這些事情而心情不好導致寫出品質不好的程式碼XDDD。

因此我們才需要工具來幫助我們在修改完程式碼並儲存後,來幫助我們自動完成這些重新編譯的程序。所以接著就要來開始說明如何導入 Devtools,並介紹他的一些相關功能與設定!

導入 Devtools

Devtools,顧名思義就是開發工具,也就是僅在開發環境時才會需要使用到的工具。因此如果要將其加入至專案中,則應確保 Devtools 只有在開發環境的部分才可以被使用。

將 Devtools 加入 pom.xml 的方式如下:

https://gist.github.com/albert-hg/565dee265969506abc687bc5bc3ebf42

特別注意在這裡我們只有把 spring-boot-devtools 加入至 dev profile 的 dependency 中,而不是將他加入 <project> 底下的 <dependencies> 內。

Devtools 配置介紹

Spring Boot - Devtools properties 內有介紹相關參數的內容,不過這裡我將properties 的格式改為使用 yml 的格式撰寫,並且加上了一些說明:

https://gist.github.com/albert-hg/cd4e3d73bb1a8251a1d85534945f1eee

在這裡值得提醒的是,因為一開始是將 spring-boot-devtools 加入於開發環境 profile 的 dependency 底下,因此這些設定的內容,也只有設定在開發環境的設定檔 (application-development.yml) 中才會有作用。

看到第一個可以設定的參數 spring.devtools.add-properties,若看到官網的說明中,他的預設值為「true」。所以當你在一導入 devtools 時,就已經啟用了 devtools 的功能。下方是依照官網中的說明,所整理出來的預設值:

https://gist.github.com/albert-hg/424b14eb744d8d7ff202a47b1e7cbd84

基本上也就是全部都啟用了。

接著會著重在三個大項目來做介紹,依序是「restart」、「livereload」以及「remote」。

spring.devtools.restart 的功能介紹

在這底下的說明有如下幾個:

  • enabled: 是否於本機端的服務中啟用devtool的restart功能
  • exclude: 指定某些路徑底下的文件被修改後不啟用restart功能
  • additional-exclude: 若不想改動到exclude的預設值,則可將欲排除啟用restart路徑的內容放在這裡
  • trigger-file: 新增對於特定的file名稱修改時啟動restart
  • additional-paths: 新增有哪些路徑底下的檔案被修改時restart
  • log-condition-evaluation-delta: 是否在restart時印出CONDITION EVALUATION DELTA訊息
  • poll-interval: 每固定秒數檢查一次是不是有文件被修改
  • quiet-period: 在發現有文件被修改時,等待固定秒數確保其他文件都沒有被修改,此值必須比poll-interval小

大部分細節其實就如同字面上說明一般,只是還是有幾個部分需要特別說明。

spring.devtools.restart.exclude

通常這裡放的會是一些靜態資源,可以看到他的預設值內容如下。必須注意的是,如果你修改了這個屬性值,這些預設值就會被覆蓋掉,所以如果並非特殊需求的話,就盡可能不要修改這項預設值。

META-INF/maven/**, META-INF/resources/**, resources/**, static/**, public/**, templates/**, **/*Test.class, **/*Tests.class, git.properties, META-INF/build-info.properties

spring.devtools.restart.additional-exclude

在不修改 exclude 的情況下,如果想要加入其他的排除使用 restart 的項目,就必須在這個屬性值中加入。

spring.devtools.restart.log-condition-evaluation-delta (參考)

這個屬性值的預設值為「true」,主要的功能是在每次 restart 時印出 condition evaluation delta 的 log。(到底是甚麼東西..)

若撇除字義上的意思,其實它實際的作用是在當你新增、修改一些auto-configuration 的時候(也就是類似 @Bean ),會於 restart 的時候給予提示。

所以如果在你每次 restart 時一直顯示「CONDITION EVALUATION DELTA」的時候,就可以將此職設定為 false。

spring.devtools.restart.poll-interval (參考)

這個值的預設值是「1s」,但實際上在設定的部分則是以毫秒為單位,因此若你輸入「1000」所代表的也會是1秒。

這個值是設定檢查是不是有文件被修改的時間週期,例如你設定 5000,則代表 devtools 會每五秒去檢查一次是否有文件被修改。

spring.devtools.restart.quiet-period (來源)

這個值的預設值是「400ms」,但實際上在設定的部分則是以毫秒為單位,因此若你輸入「400」所代表的也會是400毫秒。

這個值是設定當 devtools 發現有文件被修改時,要等待幾秒鐘,確定沒有其他文件被修改時,才會觸發 restart 的動作。

也因此,這個值的設定,必須比 poll-interval 還要短。

spring.devtools.livereload的功能介紹

如果你是開發像是 JSP,或是使用 Thymeleaf 等有牽扯到跟 View 相關的頁面開發,那麼當你修改完了程式碼,想要刷新頁面上的資料時,就勢必得在瀏覽器上按 F5 來重新刷新頁面。

而 devtools 就有提供 live reload 的功能,也就是當你修改完你的程式碼,並觸發 restart 時,於 browser 的部分也可以自動重新刷新頁面。

但是你就必須要在瀏覽器中安裝對應的 extension,才可以使用這項功能。

在下方的網址中,你可以看到一些範例影片以及若一些相關細節說明:

spring.devtools.remote 的功能介紹

如果你有一個專案已經部屬好了,例如部屬在 heroku 的平台上,那麼就可以透過 devtools 的 remote,來遠端連線已經在線上的專案,並即時的去修改正在線上的專案。另外如果有搭配 livereload 的 extension,就可以即時的在 restart 的時候刷新頁面。

不過這個功能目前僅針對在使用 IDE 上開發的開發者比較友善,例如使用 Eclipes、IntelliJ 或 STS (Spring Tool Suite),但因為我是使用 VScode開發的,所以在這部分的使用上也還在研究中,目前是有找到 STS for VScode,只是目前還沒有實際嘗試過,這部分若有機會,會在未來再進行分享。

在下方的網址中,也可以看到一些範例影片以及若一些相關細節說明 (heroku + Eclipes):

文末

這篇文章說明了怎麼將 spring-boot-devtools 導入於專案中,並且大致講解 devtools 有哪些參數可以設定,並且提了幾個比較重要的內容希望可以讓你們對於 devtools 能夠有初步但不膚淺的認識XD。

不過 devtools 最主要的功能還是替我們省下了很多那些要重複手動的操作,光是這件事情就足以讓我們在開發時能夠保持相對愉快的心情(?),更重要的是還節省了許多手動操作時間。

在接下來的文章,我們會開始進入到 Database 的應用。但是在開始之前我們會先稍微介紹一下甚麼是ORM,甚麼是JPA,這些名詞都與我們透過程式碼操作 Database 所需的相關知識有著密切的關聯,那麼我們就繼續看下去吧!

--

--

Albert Hg
learning-from-jhipster

I am a programmer but love other things. I am a nobody but keep myself going. I am a person who wishes to reach the heaven but lost the wings.