SpringBoot實現熱部署兩種方式!

前言

  小宅作爲一個Java程序員,在日常的工作中,經常需要修改代碼,然後重啓服務,在驗證代碼是否生效。如果是小項目還好,重啓速度比較快,等待時間比較短。但是隨着項目逐漸變大,並且被拆分成多個服務時,改動一些代碼,可能需要重啓多個服務才能生效。這樣下來就耗費了大量的時間在等待服務重啓。

  這樣肯定是不行的,極大的影響了我的開發效率,那麼是否有方式能夠實現,修改完代碼之後,能夠不重啓項目呢?

那肯定是有的,要不然這篇文章咋來的😁。

熱部署(Hot Swap)

  從Java1.4起,JVM引入了HotSwap,能夠在Debug的時候更新類的字節碼。所以使用熱部署,可以實現修改代碼後,無須重啓服務就可以加載修改的代碼,但是它只能用來更新方法體。作爲神器的IDEA自然是支持這一技術的。

配置IDEA

  點擊當前運行的服務,再點擊Edit Configurations

  點擊要配置的程序,找到 On ‘Update’ actionOn frame deactivation選擇 Update classes and resources。點擊OK就可以實現熱部署了。

  經過以上配置,在修改代碼以後。只需要點擊小錘子或者使用快捷鍵Command + F9重新編譯一下,就可以讓改動的代碼生效了。並且還會提示有多少個class被重新讀取了。

   雖然到這裏已經能實現熱部署的功能了。但是Java的虛擬機只能實現方法體的修改熱部署,對於整個類的結構修改,仍然需要重啓虛擬機,對類重新加載才能完成更新操作。

測試

初始狀態

方法體修改

類結構變更

  由於熱部署只支持修改方法體,所以類結構變更時會報錯,並提示是否需要重啓。

DevTools

  前面雖然通過配置IDEA實現了簡單的熱部署,但是有很明顯的缺點,只能實現方法體的修改熱部署。很明顯無法滿足日常的需求的,所以這個時候就需要使用DevTools來替代了。

   DevTools是Spring爲開發者提供了一個名爲spring-boot-devtools的模塊,來使Spring Boot應用支持熱部署,提高開發者的開發效率,無需手動重啓Spring Boot應用。使用起來非常簡單,只需要將下面的依賴引入項目裏面就可以了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

觸發重啓

   DevTools嚴格意義上其實不算熱部署,而是快速重啓。爲什麼這樣說呢?DevTools的實現原理是:使用兩個類加載器,一個是base classloader來加載不會被更改的類(例如,來自第三方的Jar),還有一個是restart classloader用來加載當前正在開發的類。所以當應用程序重新啓動時,restart classloader將被丟棄,並創建一個新的類加載器。也就意味着應用程序重新啓動通常比“冷啓動”快得多,因爲base classloader已經填充好了並且是可用的。

  簡而言之就是:通過監控類路徑資源,當類路徑上的文件發生更改時,自動重新啓動應用程序,由於只需要重新讀取被修改的類,所以要比冷啓動快

  那麼問題來了,該如何更新類路徑來觸發自動重啓呢?其實這個取決於你使用的 IDE:

  1. 在 Eclipse中,保存修改後的文件會導致更新類路徑並觸發重新啓動。
  2. 在 IntelliJ IDEA中,需要點擊Build按鈕Command + F9構建項目來實現。

配置自動重啓

  這時候可能有小夥伴想問了,難道IDEA沒有類似於Eclipse中保存文件自動觸發重啓的功能嘛。那肯定是有的,只需要進行下面兩步的配置就可以實現了。

注意:需要將前面的設置,全部還原。

  1. 開啓Build project automatically

  2. 使用快捷鍵:Ctrl + Alt + Shift + / 調出 Registry 窗口,勾選 compiler.automake.allow.when.app.running 選項。

新版本如下圖所示:

總結

 IDEA只能實現方法體的修改熱部署,無法滿足日常的使用要求,所以更推薦使用DevTools。但是如果你覺得重新啓動對你來說還不夠快。你可以考慮使用JRebel插件。

結尾

  如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。

  我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章