IDEA代碼熱部署和熱加載的三種實現(xiàn)方案
前言
在日常開發(fā)中,我們需要經(jīng)常修改 Java 代碼,手動重啟項目,查看修改后的效果。如果在項目小時,重啟速度比較快,等待的時間是較短的。但是隨著項目逐漸變大,重啟的速度變慢,等待時間 1-2 min 是比較常見的
我們可以使用代碼熱加載和熱部署解決該問題,目前實現(xiàn)方案主要有如下三種
spring-boot-devtools【不推薦】IDEA 自帶 HowSwap 功能【推薦】JRebel 插件【最推薦】
嚴(yán)格意義上,我們需要區(qū)分下熱部署和熱加載
熱部署在服務(wù)器運行時重新部署項目,即直接重新加載整個應(yīng)用,這種方式會釋放內(nèi)存,比熱加載更加干凈徹底,但同時也更費時間
熱加載在在運行時重新加載類,從而升級應(yīng)用。熱加載的實現(xiàn)原理主要依賴 java 的類加載機(jī)制,在實現(xiàn)方式可以概括為在容器啟動的時候起一條后臺線程,定時的檢測類文件的時間戳變化,如果類的時間戳變掉了,則將類重新載入。對比反射機(jī)制,反射是在運行時獲取類信息,通過動態(tài)的調(diào)用來改變程序行為;熱加載則是在運行時通過重新加載改變類信息,直接改變程序行為
spring-boot-devtools
注:本種方式重新加載速度過慢,不推薦
pom.xml
添加依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 可以防止將devtools依賴傳遞到其他模塊中 --> </dependency> </dependencies>
我們使用 IDEA 可以有兩種啟動方式
手動重啟
無任何配置時,當(dāng)我們啟動應(yīng)用之后,可以手動觸發(fā)重啟更新(Ctrl+F9),也可以使用 mvn compile
編譯觸發(fā)重啟更新
雖然這樣可以減少加載時間,但是依舊是需要手動啟動的,不太方便,所以可以使用如下自動重啟方式
自動重啟
首先需要按照如下步驟開啟 IDEA 運行時編譯
配置如下允許自動構(gòu)建項目
然后再配置允許運行時重啟
配置 application.yml
spring: devtools: restart: enabled: true #設(shè)置開啟熱部署 additional-paths: src/main/java #重啟目錄 exclude: WEB-INF/** thymeleaf: cache: false #使用Thymeleaf模板引擎,關(guān)閉緩存
其實理論上來說,devtool 本身基于重啟方式,這種仍然不是真正的熱替換方案,所以實際開發(fā)中慎用
如果自動重啟的開銷和手動重啟沒有什么太大差別,那么還不如手動重啟(按需重啟)
多數(shù)情況下,如果是方法內(nèi)部的修改或者靜態(tài)資源的修改,在 IDEA 中是可以通過 Rebuild(Ctrl + Shift + F9)進(jìn)行熱更的
HowSwap
該功能是 IDEA Ultimate 旗艦版的專屬功能,不支持 IDEA Community 社區(qū)版
設(shè)置 Spring Boot 啟動類,開啟 HotSwap 功能,之后 Debug 運行該啟動類,等待項目啟動完成。
之后每次修改 Java 代碼后,點擊左下角的「熱加載」按鈕,即可實現(xiàn)代碼熱加載。
IDEA 自帶 HowSwap 功能,支持比較有限,很多修改都不支持。例如說:
- 只能增加方法或字段但不可以減少方法或字段
- 只能增加可見性不能減少
- 只能維持已有方法的簽名而不能修改等等。
簡單來說,只支持方法內(nèi)的代碼修改熱加載,所以如果想要相對完美的方案,建議使用 JRebel 插件
JRebel
JRebel 安裝配置及激活方式有如下兩種
方法 1
注:該方法實測失敗,請使用方法 2 (但是方法 2 需要參考方法 1)
直接從 IDEA 插件市場安裝插件
安裝 JRebel 插件后,注冊地址填寫激活網(wǎng)址 + 生成的 GUID,郵箱隨便填寫,然后直接激活即可
激活網(wǎng)址列表,盡量用排序靠前的
http://jrebel-license.jiweichengzhu.com/{GUID}
https://jrebel.qekang.com/{GUID}
GUID 可以使用如下地址在線生成,然后替換上面的{GUID}就行
GUID 生成在線鏈接:在線GUID隨機(jī)生成工具-Bejson.com
郵箱地址可隨便輸入,選擇我同意,最后提交即可
方法 2
下載鏈接:JRebel and XRebel - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)
首先手動下載 2022.4.1 版本插件壓縮包,然后在 IDEA 中手動從磁盤中安裝插件
安裝完成之后重啟,之后按照如下步驟進(jìn)行,之后的激活網(wǎng)址和郵箱參照方法 1 方法填寫即可
然后點擊「Work Offline」按鈕,設(shè)置 JRebel 為離線,避免因為網(wǎng)絡(luò)問題導(dǎo)致激活失效
如何使用
注:使用 JRebel 同樣需要進(jìn)行上面 spring-boot-devtools 中 settings 中的配置。如果前面不配置,首次運行 JRebel 會自動提醒,并且詢問是否自動開啟,到時候點擊"是"即可自動配置
之后我們每次修改代碼后,保存后都會自動熱加載,當(dāng)然如果想要手動更新點擊刷新圖標(biāo)按鈕即可
以上就是IDEA代碼熱部署和熱加載的三種實現(xiàn)方案的詳細(xì)內(nèi)容,更多關(guān)于IDEA代碼熱部署和熱加載的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
RabbitMQ中的死信隊列(Dead Letter Exchanges)詳解
這篇文章主要介紹了RabbitMQ中的死信隊列(Dead Letter Exchanges)詳解,當(dāng)RabbitMQ出現(xiàn)死信,可能會導(dǎo)致業(yè)務(wù)邏輯錯誤,比如下訂單后修改庫存操作,在下單后因為某種原因,發(fā)送的消息未被簽收,這時庫存數(shù)據(jù)會出現(xiàn)不一致,需要的朋友可以參考下2023-12-12Java面向?qū)ο蟪绦蛟O(shè)計多態(tài)性示例
這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計多態(tài)性,結(jié)合實例形式分析了java多態(tài)性的概念、原理、定義與使用方法及相關(guān)注意事項,需要的朋友可以參考下2018-03-03MyBatis中resultMap和resultType的區(qū)別詳解
這篇文章主要介紹了MyBatis中resultMap和resultType的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07idea配置檢查XML中SQL語法及書寫sql語句智能提示的方法
idea連接了數(shù)據(jù)庫,也可以執(zhí)行SQL查到數(shù)據(jù),但是無法識別sql語句中的表導(dǎo)致沒有提示,下面這篇文章主要給大家介紹了關(guān)于idea配置檢查XML中SQL語法及書寫sql語句智能提示的相關(guān)資料,需要的朋友可以參考下2023-03-03Java日常練習(xí)題,每天進(jìn)步一點點(33)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07java高并發(fā)InterruptedException異常引發(fā)思考
這篇文章主要為大家介紹了java高并發(fā)InterruptedException異常引發(fā)思考,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08VSCode搭建Java開發(fā)環(huán)境的超詳細(xì)步驟
VSCode是一款多平臺的源代碼編輯器,支持多種編程語言,它輕量級、功能強大,通過豐富的插件生態(tài)系統(tǒng)可以支持更多語言和運行時,如C++、C#、Java、Python等,這篇文章主要介紹了VSCode搭建Java開發(fā)環(huán)境的超詳細(xì)步驟,需要的朋友可以參考下2024-10-10