熱部署的意思是只要類中的代碼被修改了,就能實時生效,而不用重啟項目。spring-boot-devtools 是一個為開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。原理是在發現代碼有更改之后,重新啟動應用,但是比速度比手動停止后再啟動還要更快,更快指的不是節省出來的手工操作的時間。
其深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱為 restart ClassLoader
,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啟時間(5秒以內)。
下面基於maven實現SpringBoot的熱部署解決方案:
(1)在pom.xml文件中引入 spring-boot-devtools 依賴
<!-- SpringBoot 熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- 不傳遞依賴 --> <optional>true</optional> </dependency>
(2)開啟IntelliJ IDEA的自動編譯(這里使用的IDEA版本是14.1.7)
(3)打開命令行窗口,使用"mvn spring-boot:run"命令的方式來啟動SpringBoot項目(經測試,如果通過直接運行SpringBoot的Main方法來啟動項目的話,devtools是不會生效的):
配置完畢,只要java類中的代碼被修改了,通過控制台上的日志信息可以看到項目會自動重啟,以使修改的文件實時生效。
如果不想使用熱部署了,可以通過配置來關閉熱部署,比如:
package com.xuebusi.springboot.maven; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 啟動類 * Created by xuebusi.com on 2017/4/13. */ @SpringBootApplication public class MavenApplication { public static void main(String[] args) { //熱部署開關:true表示開啟,false表示關閉 System.setProperty("spring.devtools.restart.enabled","false"); SpringApplication.run(MavenApplication.class, args); } }
上面是在main方法中傳遞配置參數,當然也可以把spring.devtools.restart.enabled屬性配置在項目的properties配置文件或者yml配置文件中,比如:
參考的文章:
http://412887952-qq-com.iteye.com/blog/2300313