1. 程式人生 > >Spring Boot熱部署—SpringBoot + Devtools

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);