1 場(chǎng)景
基于springboot進(jìn)行開(kāi)發(fā)固蛾,開(kāi)發(fā)過(guò)程中搪缨,如果每次修改代碼都將項(xiàng)目重啟,將耗費(fèi)大量的時(shí)間成本
挚币。
目前java虛擬機(jī)只能識(shí)別方法體內(nèi)的內(nèi)容更改亮蒋,如果修改整個(gè)類或者更改配置文件,仍然需要重啟java虛擬機(jī)妆毕。
使用spring-boot-devtools
慎玖,可以實(shí)現(xiàn)指定目錄(默認(rèn)為classpath路徑)下的文件進(jìn)行更改后,項(xiàng)目自動(dòng)重啟
笛粘,更改后的代碼自動(dòng)生效
趁怔。
2 開(kāi)發(fā)環(huán)境
springboot版本:2.2.9.RELEASE
開(kāi)發(fā)工具:IDEA
3 原理
spring-boot-devtools使用了兩個(gè)類加載器
ClassLoader,一個(gè)ClassLoader加載不會(huì)發(fā)生更改的類
(第三方j(luò)ar包)薪前,另一個(gè)ClassLoader(restart ClassLoader)加載會(huì)更改的類
(自定義的類)润努。
后臺(tái)啟動(dòng)一個(gè)文件監(jiān)聽(tīng)線程
(File Watcher),監(jiān)測(cè)的目錄中的文件發(fā)生變動(dòng)時(shí)示括,原來(lái)的restart ClassLoader被丟棄
铺浇,將會(huì)重新加載新的
restart ClassLoader。
因?yàn)槲募儎?dòng)后例诀,第三方j(luò)ar包不再重新加載随抠,只加載自定義的類
,加載的類比較少繁涂,所以重啟比較快
拱她。
這也是為什么,同樣是重啟應(yīng)用扔罪,為什么不手動(dòng)重啟秉沼,建議使用spring-boot-devtools進(jìn)行熱部署重啟。
4 步驟
4.1 maven配置
需要進(jìn)行熱部署的項(xiàng)目中,pom文件增加對(duì)應(yīng)的maven依賴唬复。
開(kāi)啟maven打包插件中的鉤子配置fork(devtools基于打包的鉤子配置)矗积。
<dependencies>
<!-- devtools熱部署依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- 防止將依賴傳遞到其他模塊中 -->
<optional>true</optional>
<!-- 只在運(yùn)行時(shí)起作用,打包時(shí)不打進(jìn)去(防止線上執(zhí)行打包后的程序敞咧,啟動(dòng)文件監(jiān)聽(tīng)線程File Watcher棘捣,耗費(fèi)大量的內(nèi)存資源) -->
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- devtools依賴此配置(否則,devtools不生效)休建。 -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
4.2 devtools配置
默認(rèn)devtools的exclude內(nèi)容如下(設(shè)置exclude屬性后乍恐,默認(rèn)的配置將被覆蓋
):
META-INF/maven/**,META-INF/resources/**,resources/**,static/**,public/**,templates/**
,**/*Test.class,**/*Tests.class,git.properties,META-INF/build-info.properties
yml配置如下:
spring:
devtools:
restart:
# 開(kāi)啟熱部署(更改文件后,自動(dòng)重啟)
enabled: true
## 設(shè)置哪些資源變動(dòng)后不觸發(fā)熱部署测砂,會(huì)覆蓋默認(rèn)的exclude內(nèi)容(資源不會(huì)觸發(fā)重啟茵烈,但會(huì)觸發(fā)實(shí)時(shí)重新加載)
# exclude: WEB-INF/**,static/**
## 監(jiān)控額外的路徑(優(yōu)先于exclude)
# additional-paths: src/main/java
4.3 IDEA配置
IDEA需開(kāi)啟運(yùn)行時(shí)編譯
設(shè)置1:
File->Setting->Build,Execution,Deployment->Compile
勾選:Make project automatically
設(shè)置2:
快捷鍵:ctrl+alt+shift+/
選擇:Registry
勾選:compiler.automake.allow.when.app.running
5 注意事項(xiàng)
- 默認(rèn)監(jiān)聽(tīng)classpath路徑下的文件更改
- devtools只適用于開(kāi)發(fā)環(huán)境。線上環(huán)境不可開(kāi)啟砌些,可通過(guò)設(shè)置maven依賴中的
scope
屬性為runtime
來(lái)實(shí)現(xiàn)呜投,打包時(shí)不將devtools打包到j(luò)ar包中。 - devtools需
配置在需要進(jìn)行熱部署的模塊的pom中
存璃,且不能向上傳遞仑荐,不可配置在基礎(chǔ)依賴模塊中。