1. 前言
在實際開發過程中,每次修改程式碼就得將專案重啟,重新部署,對於一些大型應用來說,重啟時間需要花費大量的時間成本。對於一個後端開發者來說,重啟過程確實很難受啊。在 Java 開發領域,熱部署一直是一個難以解決的問題,目前的 Java 虛擬機器只能實現方法體的修改熱部署,對於整個類的結構修改,仍然需要重啟虛擬機器,對類重新載入才能完成更新操作。下面我=我們就看看對於簡單的類修改的熱部署怎麼實現。
2. 原理
深層原理是使用了兩個ClassLoader,一個Classloader載入那些不會改變的類(第三方Jar包),另一個ClassLoader載入會更改的類,稱為restart ClassLoader,這樣在有程式碼更改的時候,原來的restart ClassLoader 被丟棄,重新建立一個restart ClassLoader,由於需要載入的類相比較少,所以實現了較快的重啟時間。 若想探究底層實現或者自定義載入類,可以參考大佬部落格
3. 方式
springboot有3中熱部署方式:
-
1.使用springloaded配置pom.xml檔案,使用mvn spring-boot:run啟動
-
2.使用springloaded本地載入啟動,配置jvm引數
-javaagent:<jar包地址> -noverify
- 3.使用devtools工具包,操作簡單,但是每次需要重新部署
這裡主要講解一下第三種熱部署方式的使用,因為在網上查詢資源時,總會發現很多人就是springloaded和devtools都使用了,其實是多餘的操作,而且第三種操作簡單快捷。
4. 開始配置
4.1 在pom.xml中新增依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--devtools熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
複製程式碼
注:
- (1) devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties檔案中配置spring.thymeleaf.cache=false來實現), 實現類檔案熱部署(類檔案修改後不會立即生效),實現對屬性檔案的熱部署。 即devtools會監聽classpath下的檔案變動,並且會立即重啟應用(發生在儲存時機),注意:因為其採用的虛擬機器機制,該項重啟是很快的
- (2)配置了true後在修改java檔案後也就支援了熱啟動,不過這種方式是屬於專案重啟(速度比較快的專案重啟),會清空session中的值,也就是如果有使用者登陸的話,專案重啟後需要重新登陸。
預設情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些資料夾下的檔案修改不會使應用重啟,但是會重新載入(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器重新整理)。
4.2 devtools的配置
在application.yml中配置一下devtools
spring:
devtools:
restart:
enabled: true #設定開啟熱部署
additional-paths: src/main/java #重啟目錄
exclude: WEB-INF/**
freemarker:
cache: false #頁面不載入快取,修改即時生效
複製程式碼
4.3 IDEA中配置
當我們修改了類檔案後,idea不會自動編譯,得修改idea設定。
- (1)File-Settings-Compiler-Build Project automatically
- (2)ctrl + shift + alt + / ,選擇Registry,勾上 Compiler autoMake allow when app running
4.4 測試
- 修改類–>儲存:應用會重啟
- 修改配置檔案–>儲存:應用會重啟
- 修改頁面–>儲存:應用不會重啟,但會重新載入,頁面會重新整理
5. 參考資料&小結
小結
熱部署有三種方式,我被網上的各種部落格搞得暈頭轉向的,本來不是個難問題,越看越複雜。最近有點自閉,對於敲程式碼這件事來說,我不知道我到底喜不喜歡,還是隻是單純為了找工作,我看著別人敲的程式碼,感覺自己與別人差距還很大,我覺得自己非常菜,我不知道我要是以後固定的工作,固定的敲程式碼,會不會還有進步。自閉中。。。
參考資料
其他兩種熱部署方式請參考最後一個連結