您好,登錄后才能下訂單哦!
熱部署是什么
大家都知道在項目開發過程中,常常會改動頁面數據或者修改數據結構,為了顯示改動效果,往往需要重啟應用查看改變效果,其實就是重新編譯生成了新的 Class 文件,這個文件里記錄著和代碼等對應的各種信息,然后 Class 文件將被虛擬機的 ClassLoader 加載。
而熱部署正是利用了這個特點,它監聽到如果有 Class 文件改動了,就會創建一個新的 ClaassLoader 進行加載該文件,經過一系列的過程,最終將結果呈現在我們眼前。
類加載機制
Java 中的類經過編譯器可以把代碼編譯為存儲字節碼的 Class 文件,該 Class 文件存儲了各種信息,最終要加載到虛擬機中運行使用。
類加載機制(摘自《深入理解 Java 虛擬機》)
虛擬機把描述類的數據從 Class 文件加載到內存中,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型。
Spring Boot 實現熱部署
Spring Boot 實現熱部署很簡單,我們使用上一章創建的項目 Springboot 創建簡單的 web 交互應用 來演示。
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,大家也可以通過本地進行下載。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。