1. 程式人生 > >spring boot修改程式碼後無需重啟設定,在開發時實現熱部署

spring boot修改程式碼後無需重啟設定,在開發時實現熱部署

熱部署是什麼

大家都知道在專案開發過程中,常常會改動頁面資料或者修改資料結構,為了顯示改動效果,往往需要重啟應用檢視改變效果,其實就是重新編譯生成了新的Class檔案,這個檔案裡記錄著和程式碼等對應的各種資訊,然後Class檔案將被虛擬機器的ClassLoader載入。

而熱部署正是利用了這個特點,它監聽到如果有Class檔案改動了,就會建立一個新的ClaassLoader進行載入該檔案,經過一系列的過程,最終將結果呈現在我們眼前。

類載入機制

Java中的類經過編譯器可以把程式碼編譯為儲存位元組碼的Class檔案,該Class檔案儲存了各種資訊,最終要載入到虛擬機器中執行使用。

類載入機制(摘自《深入理解 Java 虛擬機器》)

虛擬機器把描述類的資料從Class檔案載入到記憶體中,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機器直接使用的Java型別。

Spring Boot實現熱部署

Spring Boot實現熱部署有如下方式:

Spring Loaded

這種方式是以Maven外掛的形式去載入,所以啟動時使用通過Maven命令mvn spring-boot:run啟動,而通過Application.run方式啟動的會無效,因為通過應用程式啟動時,已經繞開了Maven外掛機制。

POM整合方式:

複製程式碼
<build>
    <plugins>
        <plugin>
            <
groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>
springloaded</artifactId> <version>1.2.5.RELEASE</version> </dependency> </dependencies> </plugin> </plugins> </build>
複製程式碼

spring-boot-devtools

這種方式無論怎麼啟動應用,都可以達到修改檔案後重啟應用。

POM整合方式:

<!-- 熱部署模組 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional> <!-- 這個需要為 true 熱部署才有效 -->
</dependency>

整合注意:

1、如果發現沒有熱部署效果,則需要檢查IDE配置中有沒有開啟自動編譯。

2、如果使用Thymeleaf模板引擎,需要把模板預設快取設定為false

#禁止thymeleaf快取(建議:開發環境設定為false,生成環境設定為true)
spring.thymeleaf.cache=false

3、針對devtools的可以指定目錄或者排除目錄來進行熱部署

#新增那個目錄的檔案需要restart
spring.devtools.restart.additional-paths=src/main/java
#排除那個目錄的檔案不需要restart
spring.devtools.restart.exclude=static/**,public/**

4、預設情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些資料夾下的檔案修改不會使應用重啟,但是會重新載入(devtools內嵌了一個LiveReload Server,當資源發生改變時,瀏覽器重新整理)

5、在application.properties中配置spring.devtools.restart.enabled=false,此時restart類載入器還會初始化,但不會監視檔案更新。在SprintApplication.run之前呼叫System.setProperty(“spring.devtools.restart.enabled”, “false”);可以完全關閉重啟支援。

參考: