spring-boot-devtools 是一個(gè)為開(kāi)發(fā)者服務(wù)的一個(gè)模塊,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去。原理是在發(fā)現(xiàn)代碼有更改之后,重新啟動(dòng)應(yīng)用,但是比速度比手動(dòng)停止后再啟動(dòng)還要更快,更快指的不是節(jié)省出來(lái)的手工操作的時(shí)間。
其深層原理是使用了兩個(gè)ClassLoader,一個(gè)Classloader加載那些不會(huì)改變的類(lèi)(第三方Jar包),另一個(gè)ClassLoader加載會(huì)更改的類(lèi),稱(chēng)為 restart ClassLoader
,這樣在有代碼更改的時(shí)候,原來(lái)的restart ClassLoader 被丟棄,重新創(chuàng)建一個(gè)restart ClassLoader,由于需要加載的類(lèi)相比較少,所以實(shí)現(xiàn)了較快的重啟時(shí)間(5秒以內(nèi))。
那如何使用呢,大概兩個(gè)步驟即可:
第一就是添加相應(yīng)的依賴:
<!--
devtools可以實(shí)現(xiàn)頁(yè)面熱部署(即頁(yè)面修改后會(huì)立即生效,這個(gè)可以直接在application.properties文件中配置spring.thymeleaf.cache=false來(lái)實(shí)現(xiàn)),
實(shí)現(xiàn)類(lèi)文件熱部署(類(lèi)文件修改后不會(huì)立即生效),實(shí)現(xiàn)對(duì)屬性文件的熱部署。
即devtools會(huì)監(jiān)聽(tīng)classpath下的文件變動(dòng),并且會(huì)立即重啟應(yīng)用(發(fā)生在保存時(shí)機(jī)),注意:因?yàn)槠洳捎玫奶摂M機(jī)機(jī)制,該項(xiàng)重啟是很快的
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
第二加點(diǎn):僅僅加入devtools在我們的eclipse中還不起作用,這時(shí)候還需要添加的spring-boot-maven-plugin:
<build>
<plugins>
<!--
用于將應(yīng)用打成可直接運(yùn)行的jar(該jar就是用于生產(chǎn)環(huán)境中的jar) 值得注意的是,如果沒(méi)有引用spring-boot-starter-parent做parent,
且采用了上述的第二種方式,這里也要做出相應(yīng)的改動(dòng)
-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork : 如果沒(méi)有該項(xiàng)配置,肯呢個(gè)devtools不會(huì)起作用,即應(yīng)用不會(huì)restart -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
運(yùn)行App.java ---- Run Application --- Java Application即可進(jìn)行測(cè)試。
測(cè)試方法:
· 修改類(lèi)-->保存:應(yīng)用會(huì)重啟
· 修改配置文件-->保存:應(yīng)用會(huì)重啟
· 修改頁(yè)面-->保存:應(yīng)用會(huì)重啟,頁(yè)面會(huì)刷新(原理是將spring.thymeleaf.cache設(shè)為false)
不能使用分析:
(a) 對(duì)應(yīng)的spring-boot版本是否正確,我這里使用的是1.3.3版本;
(b) 是否加入plugin了,以及屬性<fork>true</fork>
(c) Eclipse Project 是否開(kāi)啟了Build Automatically(我自己就在這里栽了坑,不知道為什么我的工具什么時(shí)候關(guān)閉了自動(dòng)編譯的功能)。
(d) 如果設(shè)置SpringApplication.setRegisterShutdownHook(false)
,則自動(dòng)重啟將不起作用。
補(bǔ)充:
默認(rèn)情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些文件夾下的文件修改不會(huì)使應(yīng)用重啟,但是會(huì)重新加載(devtools內(nèi)嵌了一個(gè)LiveReload server,當(dāng)資源發(fā)生改變時(shí),瀏覽器刷新)。
· 如果想改變默認(rèn)的設(shè)置,可以自己設(shè)置不重啟的目錄:spring.devtools.restart.exclude=static/**,public/**,這樣的話,就只有這兩個(gè)目錄下的文件修改不會(huì)導(dǎo)致restart操作了。
· 如果要在保留默認(rèn)設(shè)置的基礎(chǔ)上還要添加其他的排除目錄:spring.devtools.restart.additional-exclude
· 如果想要使得當(dāng)非classpath下的文件發(fā)生變化時(shí)應(yīng)用得以重啟,使用:spring.devtools.restart.additional-paths,這樣devtools就會(huì)將該目錄列入了監(jiān)聽(tīng)范圍。
關(guān)閉自動(dòng)重啟
設(shè)置 spring.devtools.restart.enabled 屬性為false,可以關(guān)閉該特性??梢栽?/span>application.properties中設(shè)置,也可以通過(guò)設(shè)置環(huán)境變量的方式。
public
static
void
main(String[] args){
System
.
setProperty
(
"spring.devtools.restart.enabled"
,
"false"
);
SpringApplication
.
run
(
MyApp
.
class
,
args
);