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”);可以完全關閉重啟支援。
參考: