在上一篇文章中,介紹了 Spring Boot
的項(xiàng)目結(jié)構(gòu)及自動(dòng)構(gòu)建機(jī)制,在本文中,將介紹 Spring Boot
開(kāi)發(fā)者工具。
在 Spring Boot
中包含一組額外的工具 spring-boot-devtools
,提供了一些在開(kāi)發(fā)中非常有用的功能。
在項(xiàng)目中添加 spring-boot-devtools
非常簡(jiǎn)單,只需要添加以下依賴(lài)項(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
一般只使用于開(kāi)發(fā)環(huán)境,在生產(chǎn)環(huán)境是需要禁用的,所以得設(shè)置 optional=true
(maven) 或是 developmentOnly
(gradle),這樣一來(lái),當(dāng)我們?cè)谏a(chǎn)環(huán)境啟動(dòng)服務(wù)時(shí)(比如通過(guò) java -jar
方式啟動(dòng)),spring-boot-devtools
會(huì)被禁用。同時(shí),Repackaged
生成的包默認(rèn)情況下也是不包含 devtools
的,如有需要,可以通過(guò)設(shè)置 excludeDevtools
為 false
來(lái)啟用它。
Spring Boot
為了支持某些庫(kù)使用緩存來(lái)提高性能,提供了一些設(shè)置,如:spring.thymeleaf.cache
,它將會(huì)緩存編譯模板,避免因模板的重復(fù)解析而降低系統(tǒng)性能,這在生產(chǎn)環(huán)境中是非常重要的,但是在本地開(kāi)發(fā)時(shí),這會(huì)導(dǎo)致我們每次修改模板都要重啟服務(wù),大大降低了開(kāi)發(fā)速度,為了避免這個(gè)問(wèn)題,我們需要手動(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)項(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ú)立的類(lèi)加載器。
devtools
依賴(lài)應(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è)類(lèi)加載器來(lái)加載我們的應(yīng)用,其中一個(gè)用于加載不會(huì)變更的類(lèi)(如:第三方 jar) ,另外一個(gè)則用于加載我們開(kāi)發(fā)的程序,在應(yīng)用重新啟動(dòng)時(shí),基本類(lèi)加載器不會(huì)變,但是 Spring Boot
將會(huì)直接丟棄用于加載我們自己程序的類(lèi)加載器,并重新創(chuàng)建一個(gè)類(lèi)加載器加載變更后的應(yīng)用,因?yàn)檫@樣,這種方式啟動(dòng)應(yīng)用將比普通方式啟動(dòng)更快,因?yàn)榛A(chǔ)類(lèi)已經(jīng)被加載。
如果你覺(jué)得 Spring Boot
提供的重啟還是不夠快的話(huà),可以嘗試使用其它的基于 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
以及配置屬性的變更)。你也可以通過(guò)以下屬性禁用它:
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
屬性來(lái)禁用它。
指定特殊文件觸發(fā)重啟
你可以通過(guò)設(shè)置 spring.devtools.restart.trigger-file
屬性來(lái)指定觸發(fā)重啟的文件(常用于 IDE 持續(xù)的自動(dòng)編譯 class 導(dǎo)致應(yīng)用一直重啟)。
自定義重啟使用的類(lèi)加載器
在上面我們說(shuō)過(guò) devtools
將會(huì)使用兩個(gè)類(lèi)加載器用于重啟應(yīng)用,我們可以通過(guò)以下屬性指定 classpath
下面的某個(gè)包使用哪個(gè)類(lèi)加載器:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jarrestart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
注:以上的屬性需要添加到
classpath: META-INF/spring-devtools.properties
路徑下。
devtools
包含了內(nèi)置的服務(wù)器用于 live reload ,你可以通過(guò)屬性 spring.devtools.livereload.enabled
來(lái)禁它。
你可以在本地目錄 ($HOME/.spring-boot-devtools.properties
) 添加 devtools
的全局配置文件 (.spring-boot-devtools.properties
)來(lái)設(shè)置 devtools
。如:
windows
C:\Users\當(dāng)前用戶(hù)\.spring-boot-devtools.properties
本篇文章介紹了 spring-boot-devtools
,下一篇文章中,將會(huì)介紹遠(yuǎn)程應(yīng)用的運(yùn)行及更新。
聯(lián)系客服