在上一篇文章中,介紹了 Spring Boot 的項(xiàng)目結(jié)構(gòu)及自動(dòng)構(gòu)建機(jī)制,在本文中,將介紹 Spring Boot 開發(fā)者工具。
在 Spring Boot 中包含一組額外的工具 spring-boot-devtools,提供了一些在開發(fā)中非常有用的功能。
使用
在項(xiàng)目中添加 spring-boot-devtools 非常簡單,只需要添加以下依賴項(xiàng)即可:
maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
gradle
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
因?yàn)?spring-boot-devtools 一般只使用于開發(fā)環(huán)境,在生產(chǎn)環(huán)境是需要禁用的,所以得設(shè)置 optional=true(maven) 或是 developmentOnly(gradle),這樣一來,當(dāng)我們在生產(chǎn)環(huán)境啟動(dòng)服務(wù)時(shí)(比如通過 java -jar 方式啟動(dòng)),spring-boot-devtools 會(huì)被禁用。同時(shí),Repackaged 生成的包默認(rèn)情況下也是不包含 devtools 的,如有需要,可以通過設(shè)置 excludeDevtools 為 false 來啟用它。
Dev Tools 的特性
默認(rèn)屬性
Spring Boot 為了支持某些庫使用緩存來提高性能,提供了一些設(shè)置,如:spring.thymeleaf.cache,它將會(huì)緩存編譯模板,避免因模板的重復(fù)解析而降低系統(tǒng)性能,這在生產(chǎn)環(huán)境中是非常重要的,但是在本地開發(fā)時(shí),這會(huì)導(dǎo)致我們每次修改模板都要重啟服務(wù),大大降低了開發(fā)速度,為了避免這個(gè)問題,我們需要手動(dòng)禁用 thymeleaf 緩存,但是如果你的項(xiàng)目中添加了 devtools ,那我們就不需要去一一設(shè)置這些選項(xiàng)了,devtools 為此提供了非常多的默認(rèn)設(shè)置。
devtools提供的所有默認(rèn)選項(xiàng)請(qǐng)參考:DevToolsPropertyDefaultsPostProcessor
如果你需要禁用
devtools提供的默認(rèn)屬性,請(qǐng)?jiān)O(shè)置spring.devtools.add-properties=false
自動(dòng)重啟服務(wù)
當(dāng)項(xiàng)目 classpath 下的文件發(fā)生了變動(dòng),devtools 將會(huì)幫我們自動(dòng)重啟服務(wù),這也是個(gè)非常有用的功能。
觸發(fā)重啟
因?yàn)?devtools 將會(huì)監(jiān)控應(yīng)用的 classpath 下的資源,因此當(dāng) classpath 下的資源發(fā)生了變更時(shí),應(yīng)用就會(huì)被重啟。在 Eclipse 中,保存修改后的文件將會(huì)觸發(fā)重啟;在 Idea 中,構(gòu)建項(xiàng)目(Build -> Build Project)將會(huì)導(dǎo)致應(yīng)用重啟。
但是有幾點(diǎn)需要注意:
-
devtools將會(huì)使用獨(dú)立的類加載器。 -
devtools依賴應(yīng)用程序關(guān)閉鉤子,如果你的應(yīng)用禁用了關(guān)閉鉤子(SpringApplication.setRegisterShutdownHook(false)),devtools將會(huì)失效。 - 在決定是否應(yīng)該觸發(fā)重啟時(shí),
devtools將會(huì)自動(dòng)忽略名為spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的項(xiàng)目。
重啟 vs 重新加載
Spring Boot 的重啟和我們手動(dòng)的重啟有一些區(qū)別,因?yàn)?Spring Boot 將會(huì)使用兩個(gè)類加載器來加載我們的應(yīng)用,其中一個(gè)用于加載不會(huì)變更的類(如:第三方 jar) ,另外一個(gè)則用于加載我們開發(fā)的程序,在應(yīng)用重新啟動(dòng)時(shí),基本類加載器不會(huì)變,但是 Spring Boot 將會(huì)直接丟棄用于加載我們自己程序的類加載器,并重新創(chuàng)建一個(gè)類加載器加載變更后的應(yīng)用,因?yàn)檫@樣,這種方式啟動(dòng)應(yīng)用將比普通方式啟動(dòng)更快,因?yàn)榛A(chǔ)類已經(jīng)被加載。
如果你覺得 Spring Boot 提供的重啟還是不夠快的話,可以嘗試使用其它的基于 Reload 的技術(shù),如 JRebel。
條件評(píng)估結(jié)果日志
在默認(rèn)情況下,每次重啟時(shí),Spring Boot 將會(huì)記錄條件評(píng)估的結(jié)果報(bào)告。這個(gè)報(bào)告將會(huì)展示你的應(yīng)用
auto-configuration 的變更(如增加或刪除 Bean 以及配置屬性的變更)。你也可以通過以下屬性禁用它:
spring.devtools.restart.log-condition-evaluation-delta=false
排除不需要觸發(fā)重啟的資源
我們的應(yīng)用中,某些資源的修改其實(shí)不需要重啟服務(wù),比如前端使用的靜態(tài)資源文件,默認(rèn)情況下,Spring Boot 在以下這些目錄中的資源變更時(shí),不會(huì)觸發(fā)重啟(但是會(huì)觸發(fā) live reload):
/META-INF/maven , /META-INF/resources , /resources , /static , /public , /templates
我們也可以手動(dòng)指定這些路徑:
spring.devtools.restart.exclude=static/**,public/**
如果你只是項(xiàng)額外增加路徑而不覆蓋 Spring Boot 提供的默認(rèn)設(shè)置時(shí),你可以設(shè)置這個(gè)屬性:
spring.devtools.restart.additional-exclude = /custom-path/**
當(dāng)你想設(shè)置的觸發(fā)重啟的文件不在 classpath 下的時(shí)候,你還可以使用以下設(shè)置作為觸發(fā)應(yīng)用重啟的條件:
spring.devtools.restart.additional-paths
禁用自動(dòng)重啟
如果你不想使用 devtools 提供的自動(dòng)重啟功能,你也可以設(shè)置 spring.devtools.restart.enabled 屬性來禁用它。
指定特殊文件觸發(fā)重啟
你可以通過設(shè)置 spring.devtools.restart.trigger-file 屬性來指定觸發(fā)重啟的文件(常用于 IDE 持續(xù)的自動(dòng)編譯 class 導(dǎo)致應(yīng)用一直重啟)。
自定義重啟使用的類加載器
在上面我們說過 devtools 將會(huì)使用兩個(gè)類加載器用于重啟應(yīng)用,我們可以通過以下屬性指定 classpath 下面的某個(gè)包使用哪個(gè)類加載器:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
注:以上的屬性需要添加到
classpath: META-INF/spring-devtools.properties路徑下。
LiveReload
devtools 包含了內(nèi)置的服務(wù)器用于 live reload ,你可以通過屬性 spring.devtools.livereload.enabled 來禁它。
全局設(shè)置
你可以在本地目錄 ($HOME/.spring-boot-devtools.properties) 添加 devtools 的全局配置文件 (.spring-boot-devtools.properties )來設(shè)置 devtools。如:
windows
C:\Users\當(dāng)前用戶\.spring-boot-devtools.properties
結(jié)語
本篇文章介紹了 spring-boot-devtools,下一篇文章中,將會(huì)介紹遠(yuǎn)程應(yīng)用的運(yùn)行及更新。