推薦你使用JRebel提升開發(fā)效率
項目每次啟動都要一分多鐘,改一行代碼就要重啟很難受?推薦一款提高工作效率的熱加載JVM插件:JRebel。
JRebel筆者也用很長一段時間了,這貨確實(shí)幫我省了不少時間,所以才強(qiáng)烈推薦大家使用。
這是一款實(shí)現(xiàn)熱加載的JVM插件,官方也為IDEA提供了JRebel IDEA 插件,使用和安裝也都非常簡單,動動手指就能找到很多安裝教程。
推薦參考這篇文章的破解教程,簡單可用:《JRebel破解最簡單的使用》,鏈接:https://juejin.cn/post/6844903950781677582。
安裝插件后,在idea的左側(cè)工具欄可以看到j(luò)rebel選項,點(diǎn)開后勾選需要使用jrebel插件的應(yīng)用,如下圖所示。
勾選后,當(dāng)前項目的DEBUG一欄會出現(xiàn)有jrebel logo的debug按鈕,如下圖所示。
當(dāng)我們修改某個類后,如果想要即時生效,可在當(dāng)前類的編輯窗口中右鍵,選擇Compile And Reload File,如下圖所示。
官網(wǎng)強(qiáng)調(diào)JRebel是實(shí)現(xiàn)熱加載的JVM插件,那熱加載與熱部署有何不同呢?
- 熱部署:jvm進(jìn)程不重啟,重新加載整個web應(yīng)用;
- 熱加載:運(yùn)行時重新加載類。
我們熟知的Tomcat就是使用熱部署實(shí)現(xiàn)不重啟JVM支持多web應(yīng)用部署以及重新部署,對web應(yīng)用而言是已經(jīng)重啟了,而JRebel是使用熱加載實(shí)現(xiàn)不重啟應(yīng)用也能使修改生效。
如果你做過Android應(yīng)用開發(fā),那么你應(yīng)該還熟悉一個詞:熱修復(fù)。
17年筆者在做Android應(yīng)用開發(fā)的時候熱修復(fù)這項技術(shù)就非?;?,如熱門代表:手Q空間超級補(bǔ)丁技術(shù)、微信Tinker、阿里百川HotFix。手Q空間超級補(bǔ)丁技術(shù)、微信Tinker在實(shí)現(xiàn)原理上都是通過在應(yīng)用啟動時將新的dex替換舊的dex實(shí)現(xiàn)(替換class),需要應(yīng)用重啟才生效,阿里百川推出的熱修復(fù)HotFix則不同于前兩者,下拉補(bǔ)丁后無需重啟應(yīng)用就能立即生效。
為什么Android應(yīng)用開發(fā)領(lǐng)域的熱修復(fù)可以那么火?不同于WEB應(yīng)用更新,WEB應(yīng)用更新用戶是被動接受,而Android版本更新需要用戶主動去更新。而使用熱修復(fù)可以實(shí)現(xiàn)讓用戶被動接受更新,在應(yīng)用重啟時神不知鬼不覺的動態(tài)修復(fù)bug,優(yōu)化用戶體驗,同時也就減少APP的卸載率。
隨著后端項目不斷臃腫,導(dǎo)致依賴的很多框架初始耗時越來越長,熱加載開始被用于提升后端開發(fā)效率,被用到后端開發(fā)調(diào)試上。當(dāng)然,也有使用熱加載實(shí)現(xiàn)修復(fù)線上bug的,但在微服務(wù)容器化部署時代,已經(jīng)體現(xiàn)不出這樣做的價值了。
你可能會說,現(xiàn)在微服務(wù)不會很臃腫,本地調(diào)試重啟也就幾秒鐘的事情,使用它效率也不明顯。但如果重啟需要重新登錄或者說需要做一些初始化工作就不好說了。
盡管熱加載很實(shí)用,它可以幫我們省去大部分改寫代碼的重啟時間。但也并不是所有場景都能使用熱加載替代重啟。
如果我們改動的是Mybatis的SQL、Spring的注解或配置類等,我們依然需要重啟應(yīng)用。原因很好理解,我們就以依賴Spring和Mybatis框架的應(yīng)用為例說明。
首先是修改Spring配置類或者一些類上的注解重新編譯熱加載后發(fā)現(xiàn)修改并未生效,這是因為Spring只在容器啟動時應(yīng)用配置類、掃描Bean類時讀取類上的注解等。
其次是Mybatis,無論我們修改的是注解上的Sql還是xml文件中的Sql都不會生效,因為Mybatis初始化時就需要讀取xml文件中的sql或者接口方法上注解的sql來為接口生成代理類,后續(xù)不會再用到注解或xml文件,因此動態(tài)修改不會生效。
說到Mybatis,筆者找到一款I(lǐng)DEA插件能夠解決修改sql需要重啟應(yīng)用的問題:【jrebel-mybatisplus-idea-plugin】https://github.com/SweetInk/jrebel-mybatisplus。
關(guān)于JRebel的實(shí)現(xiàn)原理筆者也不了解,因為找不到更多資料,JRebel也不開源。如果讓我實(shí)現(xiàn)一個簡單的熱加載,我也有一個簡單的思路,通過已知的Java Agent和IDEA插件知識,可以通過動態(tài)重新加載類的方式完成簡單的方法代碼改寫,也會有應(yīng)用場景,如修復(fù)調(diào)試時發(fā)現(xiàn)的空指針異常、不涉及其它框架的業(yè)務(wù)邏輯錯誤、組件邏輯錯誤等,避免過多的應(yīng)用重啟。
本文轉(zhuǎn)載自微信公眾號「Java藝術(shù)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java藝術(shù)公眾號。