Spring Boot熱部署—SpringBoot + Devtools
技術介紹
devtools:是spring boot的一個熱部署工具,當修改了classpath下的檔案(包括類檔案、屬性檔案、頁面等)時,會重新啟動應用(由於其採用的雙類載入器機制,這個啟動會非常快,如果發現這個啟動比較慢,可以選擇使用jrebel)雙類載入器機制:boot使用了兩個類載入器來實現重啟(restart)機制:base類載入器(簡稱bc)+restart類載入器(簡稱rc)。
bc:用於載入不會改變的jar(第三方依賴的jar)
rc:用於載入我們正在開發的jar(整個專案裡我們自己編寫的類)。當應用重啟後,原先的rc被丟掉、重新new一個rc來載入這些修改過的東西,而bc卻不需要動一下。
使用spring-boot-devtools實現熱部署
1、新增依賴
<!-- devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties檔案中配置spring.thymeleaf.cache=false來實現), 實現類檔案熱部署(類檔案修改後不會立即生效),實現對屬性檔案的熱部署。 即devtools會監聽classpath下的檔案變動,並且會立即重啟應用(發生在儲存時機),注意:因為其採用的虛擬機器機制,該項重啟是很快的 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
2、僅僅新增依賴eclipse中還不起作用,再新增的spring-boot-maven-plugin
<build>
<plugins>
<!--
用於將應用打成可直接執行的jar(該jar就是用於生產環境中的jar) 值得注意的是,如果沒有引用
spring-boot-starter-parent做parent,且採用了上述的第二種方式,這裡也要做出相應的改動 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--fork : 如果沒有該項配置,devtools不會起作用,即應用不會restart --> <fork>true</fork> </configuration> </plugin> </plugins> </build>
不能使用分析:
(a) 對應的spring-boot版本是否正確,我這裡使用的是1.3.2版本;
(b) 是否加入spring-boot-maven-plugin,以及屬性<fork>true</fork>
(c) Eclipse Project 是否開啟了Build Automatically
(d) 如果設定SpringApplication.setRegisterShutdownHook(false),則自動重啟將不起作用。
補充:
1、預設情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些資料夾下的檔案修改不會使應用重啟,但是會重新載入(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器重新整理)。
2、如果想改變預設的設定,可以自己設定不重啟的目錄:spring.devtools.restart.exclude=static/**,public/**,這樣的話,就只有這兩個目錄下的檔案修改不會導致restart操作了。
3、如果要在保留預設設定的基礎上還要新增其他的排除目錄:spring.devtools.restart.additional-exclude
4、如果想要使得當非classpath下的檔案發生變化時應用得以重啟,使用:spring.devtools.restart.additional-paths,這樣devtools就會將該目錄列入了監聽範圍。
關閉自動重啟
設定 spring.devtools.restart.enabled 屬性為false,可以關閉該特性。可以在application.properties中設定,也可以通過設定環境變數的方式。
System.setProperty("spring.devtools.restart.enabled","false");
SpringApplication.run(MyApp.class, args);