學習Spring Boot:(五)使用 devtools熱部署

前言

spring-boot-devtools 是一個爲開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。原理是在發現代碼有更改以後,從新啓動應用,可是比速度比手動中止後再啓動還要更快,更快指的不是節省出來的手工操做的時間。css

其深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另外一個ClassLoader加載會更改的類,稱爲 restart ClassLoaderjava

,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,從新建立一個restart ClassLoader,因爲須要加載的類相比較少,因此實現了較快的重啓時間(5秒之內)。spring

正文

第一步:添加依賴

<!-- devtools能夠實現頁面熱部署(即頁面修改後會當即生效,這個能夠直接在application.properties文件中配置spring.thymeleaf.cache=false來實現), 實現類文件熱部署(類文件修改後不會當即生效),實現對屬性文件的熱部署。 即devtools會監聽classpath下的文件變更,而且會當即重啓應用(發生在保存時機),注意:由於其採用的虛擬機機制,該項重啓是很快的 -->  
       <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-devtools</artifactId>  
            <optional>true</optional>  
        </dependency>

第二步:配置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>

第三步:開啓編譯器的自動編譯

  • Eclipse Project 在運行選項中查看是否開啓了Build Automatically,若是沒勾上,就選中勾上。Eclipse默認是自動編譯的。
  • IDEA 默認在非RUN或DEBUG狀況下才會自動編譯。所以,咱們在啓動Spring Boot後,再次修改類的時候不會自動編譯的,開啓在Run狀態自動編譯的流程以下:
    1. setting -> build
      springboot-5-1.png
    2. Shift+Ctrl+Alt+/,選擇Registry;
    3. 找到下面的選項,勾選上就好了:
      springboot-5-2.png
      個人是已經勾選過了的,因此是藍顏色的提示,第一次就去找c開頭的就能夠了。

第四步:運行測試

啓動項目,在run dashboard發現有devtools:
springboot-5-3.png
1. 修改類文件,項目重啓;
2. 修改配置文件,項目重啓。瀏覽器

補充

  1. 若是設置SpringApplication.setRegisterShutdownHook(false),則自動重啓將不起做用。
  2. 默認狀況下,/META-INF/maven/META-INF/resources/resources/static/templates/public這些文件夾下的文件修改不會使應用重啓,可是會從新加載(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器刷新)。
  3. 若是想改變默認的設置,能夠本身設置不重啓的目錄:spring.devtools.restart.exclude=static/**,public/**,這樣的話,就只有這兩個目錄下的文件修改不會致使restart操做了。
  4. 若是要在保留默認設置的基礎上還要添加其餘的排除目錄:spring.devtools.restart.additional-exclude;
  5. 若是想要使得當非classpath下的文件發生變化時應用得以重啓,使用:spring.devtools.restart.additional-paths,這樣devtools就會將該目錄列入了監聽範圍。
  6. 設置 spring.devtools.restart.enabled 屬性爲false,能夠關閉自動重啓。能夠在application.properties中設置,也能夠經過設置環境變量的方式。
public static void main(String[] args){
    System.setProperty("spring.devtools.restart.enabled","false");
    SpringApplication.run(MyApp.class, args);
}

參考文章:

相關文章
相關標籤/搜索