程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring boot實現熱部署的兩種方式詳解

Spring boot實現熱部署的兩種方式詳解

編輯:關於JAVA

Spring boot實現熱部署的兩種方式詳解。本站提示廣大學習愛好者:(Spring boot實現熱部署的兩種方式詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring boot實現熱部署的兩種方式詳解正文


熱部署是什麼

大家都知道在項目開發過程中,常常會改動頁面數據或者修改數據結構,為了顯示改動效果,往往需要重啟應用查看改變效果,其實就是重新編譯生成了新的 Class 文件,這個文件裡記錄著和代碼等對應的各種信息,然後 Class 文件將被虛擬機的 ClassLoader 加載。

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

類加載機制

Java 中的類經過編譯器可以把代碼編譯為存儲字節碼的 Class 文件,該 Class 文件存儲了各種信息,最終要加載到虛擬機中運行使用。

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

虛擬機把描述類的數據從 Class 文件加載到內存中,並對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型。

Spring Boot 實現熱部署

Spring Boot 實現熱部署很簡單,我們使用上一章創建的項目 Springboot 創建簡單的 web 交互應用 來演示。

使用 Spring Loaded 使用 spring-boot-devtools

springloaded

在 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.6.RELEASE</version>
   </dependency>
  </dependencies>
 </plugin>
 </plugins>
</build>

添加完畢,啟動項目

Note

這次啟動不能直接運行 main 方法了,需要使用
mvn spring-boot:run 啟動,然後隨意在代碼中寫一個 System.out.println("Hi") ,再次調用那個方法,會發現控制台會打印出 Hi。

spring-boot-devtools

添加 POM 文件依賴

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

然後還是使用 mvn spring-boot:run 啟動項目,隨意更改代碼即可看到效果。

如果我們想指定讓 devtools 監聽指定文件夾,那麼可以在 application.yml 配置
spring.devtools.restart.additional-paths=your path,注意這裡需要改成 yml 文件的格式。

Important(特別注意)

可能會有同學按照以上方法處理了都無效。

這裡要特別注意下:由於熱部署是監聽 Class 文件的變化,它自身不會主動去編譯 Java 文件,所以我們得在 Java 文件改動時,自動編譯成 Class 文件,然後熱部署工具創造的新的類加載器才會加載改變後的 Class 文件。

所以,如果你使用 IDEA 開發工具的話,記得要把自動編譯打開。

如圖打鉤即可。

由於熱部署的時候是產生了新的類加載器,我們的一個類可能在虛擬機中存在兩個類,比如代碼中就一個 User 類,但是虛擬機中會存在兩個 User ,雖然是同一個 Class 文件,但是卻是兩個獨立的類,這個要清楚。

由於第一次使用熱部署,一開始遇到個很奇怪的問題,A instanceof A == false,明明兩個 A.getClass() 都一樣,但結果就是 false,還問了幾個朋友,表示都沒遇到,後來當我把 devtools 依賴注釋後,才正確執行。

如果有遇到類似問題的朋友,可以檢查下是不是由於不同的 ClassLoader 造成的。

本系列所有代碼已同步到 GitHub, 項目地址 github:sboot-learn,大家也可以通過本地進行下載。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對的支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved