Spring DevTools 介紹

Spring DevTools 介紹

Spring Boot包括一組額外的工具,可使應用程序開發體驗更加愉快。 spring-boot-devtools模塊能夠包含在任何項目中,它能夠節省大量的時間。 想要使用devtools支持,只需將模塊依賴關係添加到你的構建中:css

Maven.html

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

Gradle.java

dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}

運行打包的應用程序時,開發人員工具會自動禁用。若是你經過 java -jar或者其餘特殊的類加載器進行啓動時,都會被認爲是「生產環境的應用」。git

將依賴標記爲optional可選是一種最佳作法,能夠防止將devtools依賴傳遞到其餘模塊中。Gradle 不支持開箱即用的optional依賴項,你能夠參考propdeps-plugingithub

1、屬性默認值

Spring Boot 支持的一些庫中會使用緩存來提升性能。例如模版引擎將緩存編譯後的模板,以免重複解析模板文件。 此外,Spring MVC能夠在服務靜態資源時向響應中添加HTTP緩存頭。正則表達式

雖然緩存在生產中很是有益,但它在開發過程當中可能會產生反效果,它會阻止你看到剛剛在應用程序中進行的更改。 所以,spring-boot-devtools將默認禁用這些緩存選項。spring

緩存選項一般在application.properties文件中配置。 例如,Thymeleaf提供了spring.thymeleaf.cache屬性。spring-boot-devtools模塊不須要手動設置這些屬性,而是自動應用合理的開發時配置。瀏覽器

2、自動重啓

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() 使用。

不幸的是,一些第三方庫都不考慮在使用上下文類加載器的狀況下反序列化。 若是你發現這樣的問題,你須要向原做者請求修復。

3、實時加載

spring-boot-devtools模塊包含嵌入式LiveReload服務器,能夠在資源更改時用於觸發瀏覽器刷新。 LiveReload瀏覽器擴展程序支持Chrome,Firefox和Safari,你能夠從livereload.com免費下載。

若是你不想在應用程序運行時啓動LiveReload服務器,則能夠將spring.devtools.livereload.enabled屬性設置爲false

同一時間只能運行一個LiveReload服務器。 開始應用程序以前,請確保沒有其餘LiveReload服務器正在運行。若是從IDE啓動多個應用程序,則只有第一個應用程序將支持LiveReload。

4、全局設置

你能夠經過向$HOME文件夾添加名爲.spring-boot-devtools.properties的文件來配置全局devtools設置(請注意,文件名以「.」開頭)。 添加到此文件的任何屬性將適用於你的計算機上使用devtools的全部 Spring Boot應用程序。 例如,要配置重啓始終使用觸發器文件 ,你能夠添加如下內容:

〜/ .spring-boot-devtools.properties。

spring.devtools.reload.trigger-file=.reloadtrigger

Spring Boot 系列

  1. Spring Boot 入門

  2. Spring Boot 屬性配置和使用

  3. Spring Boot 集成MyBatis

  4. Spring Boot 靜態資源處理

  5. Spring Boot - 配置排序依賴技巧

  6. Spring Boot - DevTools 介紹

相關文章
相關標籤/搜索