作用
spring boot 提供devtools工具spring-boot-devtools用于開發(fā)的時候熱部署,無需手動重啟實現(xiàn)自動加載
原理
spring boot devtools 的原理其實就是監(jiān)聽classpath下的文件,當文件有變動時,根據(jù)配置的策略進行重啟。
restart與reload
自動重啟的原理在于spring boot使用兩個classloader:不改變的類(如第三方j(luò)ar)由base類加載器加載,正在開發(fā)的類由restart類加載器加載。
應用重啟時,restart類加載器被扔掉重建,而base類加載器不變,這樣重啟會很快。
如果重啟不夠快,或者遇到類加載問題,可以使用reload技術(shù),如JRebel或Spring Loaded等。
使用
如何引入
Maven中添加依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
在運行完全打包的應用程序時,開發(fā)工具會自動被禁用,如果您的應用程序是從java -jar啟動的,或者是從一個特殊的類加載器開始的,那么它就被認為是一個“生產(chǎn)應用程序”。
將依賴項標記為Maven中的可選項<optional>true</optional>或在Gradle中使用compileOnly是一種最佳實踐,它可以防止devtools被傳遞到其他使用你的項目的模塊中。
如何開啟
Properties文件配置
#開啟熱部署
spring.devtools.restart.enabled=true
#不加載頁面緩存
spring.freemarker.cache=false
直接啟動springboot項目
啟用項目截圖:

功能
自動重啟
使用spring-boot-devtools的應用程序在類路徑更改時自動重新啟動。默認情況下,指向一個文件夾的類路徑上的任何條目都會被監(jiān)控以進行更改。需要注意的是,某些資源例如靜態(tài)資產(chǎn)和視圖模板不需要重新啟動應用程序,devtools默認更改這些靜態(tài)文件不自動重啟
在IDEA中的使用
idea默認需要手動編譯,所以需要設(shè)置自動編譯
-
File --> Settings --> Compiler --> 勾選Build Project automatically
-
ctrl + shift + alt + / --> Registry --> 勾選Compiler autoMake allow when app running


實時加載
spring-boot-devtools模塊包含嵌入式LiveReload服務(wù)器,可以在資源更改時用于觸發(fā)瀏覽器刷新。 LiveReload瀏覽器擴展程序支持Chrome,F(xiàn)irefox和Safari,你可以從livereload.com免費下載。
如果你不想在應用程序運行時啟動LiveReload服務(wù)器,則可以將spring.devtools.livereload.enabled屬性設(shè)置為false 。
同一時間只能運行一個LiveReload服務(wù)器。 開始應用程序之前,請確保沒有其他LiveReload服務(wù)器正在運行。如果從IDE啟動多個應用程序,則只有第一個應用程序?qū)⒅С諰iveReload。
配置
排除資源
某些資源在更改時不一定需要觸發(fā)重啟。默認情況下,更改/META-INF/maven , /META-INF/resources , /resources , /static , /public或/templates中的資源不會觸發(fā)重啟,但會觸發(fā)實時重新加載。
如果要自定義這些排除項,可以使用spring.devtools.restart.exclude屬性添加需要排除監(jiān)控的路徑。
#排除自動重啟監(jiān)控的路徑
spring.devtools.restart.exclude=
監(jiān)控額外的路徑
當對不在類路徑中的文件進行更改時,可能需要重啟或重新加載應用程序??梢允褂胹pring.devtools.restart.additional-paths屬性來配置監(jiān)視其他路徑的更改。
同時配置spring.devtools.restart.exclude可以選擇這些path的變化是重新啟動還是熱加載。
#監(jiān)控額外路徑
spring.devtools.restart.additional-paths=
使用觸發(fā)文件
若不想每次修改都觸發(fā)自動重啟,可以設(shè)置spring.devtools.restart.trigger-file指向某個文件,只有更改這個文件時才觸發(fā)自動重啟。
#修改這個文件才觸發(fā)重啟
spring.devtools.restart.trigger-file=
定制restart類加載器
默認時,IDE中打開的項目都會由restart加載器加載,jar文件由Base加載器加載。
但是若你使用multi-module的項目,并且不是所有模塊都被導入到IDE中,此時會導致加載器不一致。
#base類加載器
restart.exclude.companycommonlibs=
#restart類加載器
restart.include.projectcommon=
include元素是應該被放入“restart”類加載器的項目, exclude元素是應該放入“base”類加載器的。
禁用重啟
如果不想使用重啟功能,可以使用spring.devtools.restart.enabled屬性來禁用它。(這仍將初始化重啟類加載器,但不會監(jiān)視文件更改)
#禁用重啟
spring.devtools.restart.enabled=false


