Spring DevTools 介紹
Spring Boot包括一組額外的工具,可以使應用程式開發體驗更加愉快。
spring-boot-devtools
子產品可以包含在任何項目中,它可以節省大量的時間。 想要使用devtools支援,隻需将子產品依賴關系添加到你的建構中:
Maven.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle.
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
運作打包的應用程式時,開發人員工具會自動禁用。如果你通過
java -jar
或者其他特殊的類加載器進行啟動時,都會被認為是“生産環境的應用”。
将依賴标記為
可選是一種最佳做法,可以防止将devtools依賴傳遞到其他子產品中。Gradle 不支援開箱即用的
optional
optional
依賴項,你可以參考propdeps-plugin。
IDEA 中使用時,需要配置自動編譯和運作時自動編譯,參考下面位址配置即可:
https://qiancheng.me/post/coding/spring-boot-devtools-hotswap
一、屬性預設值
Spring Boot 支援的一些庫中會使用緩存來提高性能。例如模版引擎将緩存編譯後的模闆,以避免重複解析模闆檔案。 此外,Spring MVC可以在服務靜态資源時向響應中添加HTTP緩存頭。
雖然緩存在生産中非常有益,但它在開發過程中可能會産生反效果,它會阻止你看到剛剛在應用程式中進行的更改。 是以,spring-boot-devtools将預設禁用這些緩存選項。
緩存選項通常在
application.properties
檔案中配置。 例如,Thymeleaf提供了
spring.thymeleaf.cache
屬性。
spring-boot-devtools
子產品不需要手動設定這些屬性,而是自動應用合理的開發時配置。
二、自動重新開機
spring-boot-devtools
會在類路徑上的檔案發生更改時自動重新開機。 這在IDE中工作時可能是一個有用的功能,因為它為代碼更改提供了非常快的回報循環。 預設情況下會監視類路徑上的所有變動,但請注意,某些資源(如靜态資源和視圖模闆)不需要重新開機應用程式。
觸發重新開機
當DevTools監視類路徑資源時,觸發重新開機的唯一方法是更新類路徑。 導緻類路徑更新的方式取決于你正在使用的IDE。在Eclipse中,儲存修改的檔案将導緻類路徑被更新并觸發重新開機。 在IntelliJ IDEA中,建構項目(
Build -> Make Project
)将具有相同的效果。
重新啟動和重新加載
Spring Boot提供的重新啟動技術使用了兩個類加載器。 不改變的類(例如,來自第三方jar的)被加載到 base 類加載器中。 你正在開發的類被加載到 restart 類加載器中。 當應用程式重新開機時, restart加載器将被丢棄,并建立一個新的類加載器。 這種方法意味着應用程式重新開機通常比“冷啟動”快得多,因為 base 加載器已經已加載并且可用。
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.devtools.restart.additional-exclude
2. 監控額外的路徑
當你對不在類路徑中的檔案進行更改時,可能需要重新開機或重新加載應用程式。 為此,請使用
spring.devtools.restart.additional-paths
屬性來配置監視其他路徑的更改。 你可以使用上述的
spring.devtools.restart.exclude
屬性來控制附加路徑下的更改是否會觸發完全重新開機或隻是實時重新加載 。
3. 禁用重新開機
如果不想使用重新開機功能,可以使用
spring.devtools.restart.enabled
屬性來禁用它。 在大多數情況下,你可以在
application.properties
中設定此項(這仍将初始化重新開機類加載器,但不會監視檔案更改)。
例如,如果你需要完全禁用重新開機支援,因為它不适用于特定庫,則需要在調用
SpringApplication.run(…)
之前設定
System
屬性。 例如:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
4. 使用觸發檔案
如果你使用自動編譯已更改檔案的IDE,則可能希望僅在特定時間觸發重新開機。 為此,你可以使用“觸發檔案”,這是一個特殊檔案,當你要實際觸發重新開機檢查時,必須修改它。 更改檔案隻會觸發檢查,隻有在Devtools檢測到它必須執行某些操作時才會重新開機。 觸發檔案可以手動更新,也可以通過IDE插件更新。
要使用觸發器檔案,請使用
spring.devtools.restart.trigger-file
屬性。
如果你希望将 spring.devtools.restart.trigger-file
設定為全局配置,可以參考下面第四小節。
5. 自定義重新開機類加載器
如上面重新啟動和重新加載部分所述,重新開機功能是通過使用兩個類加載器實作的。 對于大多數應用程式,此方法運作良好,但有時可能會導緻類加載問題。
預設情況下,IDE中的任何打開的項目都會使用“restart”類加載器加載,任何正常
.jar
檔案将使用“base”類加載器加載。 如果你在多子產品項目上工作,但不是每個子產品都導入到IDE中,則可能需要自定義配置。 為此,你可以建立一個
META-INF/spring-devtools.properties
檔案。
spring-devtools.properties
檔案可以包含
restart.exclude.
和
restart.include.
字首的屬性。
include
元素是應該被放入“restart”類加載器的項目,
exclude
元素是應該放入“base”類加載器的項目。 屬性的值是應用于類路徑下的正規表達式。
例如:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
針對通用Mapper,可以做如下配置:
restart.include.mapper=/mapper-[\\w-\\.]+jar
所有屬性的鍵值(名字,companycommonlibs 部分)必須是唯一的,隻有
和
restart.exclude.
restart.include.
開頭的屬性有效。
所有類路徑下面的
META-INF/spring-devtools.properties
配置檔案都會生效,是以你可以把該配置打包到每個子產品中。
**注:**新版本的Mapper(3.4.1+)會預設增加該配置。
6. 已知限制
重新開機功能對使用标準
ObjectInputStream
對象序列化的對象不是很好 。如果需要反序列化資料,可能需要使用Spring的
ConfigurableObjectInputStream
配合
Thread.currentThread().getContextClassLoader()
使用。
不幸的是,一些第三方庫都不考慮在使用上下文類加載器的情況下反序列化。 如果你發現這樣的問題,你需要向原作者請求修複。
三、實時加載
spring-boot-devtools
子產品包含嵌入式LiveReload伺服器,可以在資源更改時用于觸發浏覽器重新整理。 LiveReload浏覽器擴充程式支援Chrome,Firefox和Safari,你可以從livereload.com免費下載下傳。
如果你不想在應用程式運作時啟動LiveReload伺服器,則可以将
spring.devtools.livereload.enabled
屬性設定為
false
。
同一時間隻能運作一個LiveReload伺服器。 開始應用程式之前,請確定沒有其他LiveReload伺服器正在運作。如果從IDE啟動多個應用程式,則隻有第一個應用程式将支援LiveReload。
四、全局設定
spring.devtools.reload.trigger-file=.reloadtrigger
Spring Boot 系列
- Spring Boot 入門
- Spring Boot 屬性配置和使用
- Spring Boot 內建MyBatis
- Spring Boot 靜态資源處理
- Spring Boot - 配置排序依賴技巧
- Spring Boot - DevTools 介紹