當前位置:
首頁 > 最新 > Spring Boot乾貨系列:開發常用的熱部署方式匯總

Spring Boot乾貨系列:開發常用的熱部署方式匯總

前言

平時開發Sprig Boot的時候,經常改動個小小的地方就要重新啟動項目,這無疑是一種很差的體驗。在此,博主收集了3種熱部署的方案供大家選擇。

正文

目前博主用過的有三種:

Spring Loaded

spring-boot-devtools

JRebel插件

博主開發環境Spring Loaded 實現熱部署

Spring Loaded是一個用於在JVM運行時重新載入類文件更改的JVM代理,Spring Loaded允許你動態的新增/修改/刪除某個方法/欄位/構造方法,同樣可以修改作用在類/方法/欄位/構造方法上的註解.也可以新增/刪除/改變枚舉中的值。

spring-loaded是一個開源項目,項目地址:https://github.com/spring-projects/spring-loaded

Spring Loaded有兩種方式實現,分別是Maven引入依賴方式或者添加啟動參數方式

Maven依賴方式

啟動:

如果你也是IDEA的話,直接界面上雙擊運行即可,如下圖

注意:maven依賴的方式只適合spring-boot:run的啟動方式,右鍵那種方式不行。

出現如下配置表實配置成功:

添加啟動參數方式

這種方式是右鍵運行啟動類

首先先下載對應的springloaded-1.2.6.RELEASE.jar,可以去上面提到的官網獲取

博主這裡直接引用maven依賴已經下載好的路徑哈

然後打開下圖所示的Edit Configurations配置,在VM options中輸入:

然後直接右鍵運行啟動類即可啟動項目。

上面2種方式小夥伴隨便選擇一種即可,當系統通過 mvn spring-boot:run啟動或者 右鍵application debug啟動Java文件時,系統會監視classes文件,當有classes文件被改動時,系統會重新載入類文件,不用重啟啟動服務。

註:IDEA下需要重新編譯文件 Ctrl+Shift+F9或者編譯項目 Ctrl+F9

如何測試熱部署是否可用呢,你可以先寫個簡單的Controller方法,返回個字元串,然後啟動項目,接著修改下這個方法返回的字元串,Ctrl+Shift+F9編譯下當前類,然後再刷新下頁面看看是否內容改變了。

在 Spring Boot,模板引擎的頁面默認是開啟緩存,如果修改頁面內容,刷新頁面是無法獲取修改後的頁面內容,所以,如果我們不需要模板引擎的緩存,可以進行關閉。

經過博主簡單的測試,發現大多數情況可以使用熱部署,有效的解決了文章頭部中提到的那個痛點,不過還是有一些情況下需要重新啟動,不可用的情況如下:

1:對於一些第三方框架的註解的修改,不能自動載入,比如:spring mvc的@RequestMapping

2:application.properties的修改也不行

3:log4j的配置文件的修改不能即時生效

spring-boot-devtools 實現熱部署

spring-boot-devtools為應用提供一些開發時特性,包括默認值設置,自動重啟,livereload等。

想要使用devtools熱部署功能,maven添加依賴如下:

將依賴關係標記為可選是一種最佳做法,可以防止使用項目將devtools傳遞性地應用於其他模塊。

默認屬性

在Spring Boot集成Thymeleaf時,屬性設置為false可以禁用模板引擎編譯的緩存結果。

現在,devtools會自動幫你做到這些,禁用所有模板的緩存,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。

更多的屬性,請參考DevToolsPropertyDefaultsPostProcessor。

自動重啟

自動重啟的原理在於spring boot使用兩個classloader:不改變的類(如第三方jar)由base類載入器載入,正在開發的類由restart類載入器載入。應用重啟時,restart類載入器被扔掉重建,而base類載入器不變,這種方法意味著應用程序重新啟動通常比「冷啟動」快得多,因為base類載入器已經可用並已填充。

所以,當我們開啟devtools後,classpath中的文件變化會導致應用自動重啟。

當然不同的IDE效果不一樣,Eclipse中保存文件即可引起classpath更新(註:需要打開自動編譯),從而觸發重啟。而IDEA則需要自己手動CTRL+F9重新編譯一下(感覺IDEA這種更好,不然每修改一個地方就重啟,好蛋疼)

排除靜態資源文件

靜態資源文件在改變之後有時候沒必要觸發應用程序重啟,例如thymeleaf模板文件就可以實時編輯,默認情況下,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的資源不會觸發重啟,而是觸發live reload(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器刷新,下面會介紹)。

如果想保留默認配置,同時增加新的配置,則可使用

觀察額外的路徑關閉自動重啟

設置 spring.devtools.restart.enabled 屬性為false,可以關閉該特性。可以在application.properties中設置,也可以通過設置環境變數的方式。

使用一個觸發文件自定義自動重啟類載入器

默認時,IDE中打開的項目都會由restart載入器載入,jar文件由Base載入器載入,但是若你使用multi-module的項目,並且不是所有模塊都被導入到IDE中,此時會導致載入器不一致。這時你可以創建META-INF/spring-devtools.properties文件,並增加restart.exclude.XXX,restart.include.XXX來配置哪些jar被restart載入,哪些被base載入。如:

LiveReload

DevTools內置了一個LiveReload服務,可以在資源變化時用來觸發瀏覽器刷新。當然這個需要你瀏覽器安裝了LiveReload插件,並且啟動這個插件才行。很有意思,這裡介紹下如何弄。

先去谷歌商店安裝LiveReload插件,自己準備梯子。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 後端編程嘟 的精彩文章:

TAG:後端編程嘟 |

您可能感興趣

ASDK系列2:在Azure新的Region上安裝部署Azure Stack開發工具包的第二種方法
e 絡盟推出GraspIO Cloudio—一款Raspberry Pi擴展板,配有移動平台,適用於端對端物聯網開發和部署
Python Web部署方式總結
Net Core 自動化部署:使用jenkins部署應用
BM推出了AIOpenScale和Multi-cloud Manager,以簡化AI和雲部署
Oracle開源GraphPipe:幾行代碼讓你在TensorFlow部署PyTorch模型
Aruba OnConnect 方案部署
Alphabet將與Telkom在肯亞用熱氣球部署移動網路
如何使用 TensorFlow mobile將PyTorch和Keras 部署到移動設備
在 Kubernetes 上部署 Spinnaker
Nginx+uwsgi部署Django應用
重磅:戴爾科技宣布推出Dell Technologies Cloud,志在簡化混合雲部署
Inception部署
索尼為Xperia XA1/Plus和Ultra部署Android Oreo推送
SpringBoot如何進行項目打包部署
Linux Kernel 發布:已準備好大規模部署
使用Kubespray部署生產可用的Kubernetes集群
拋棄Windows Phone,紐約警察局開始部署蘋果iPhone 7/7 Plus
Python Web 部署方式大全
Solr12-SolrCloud部署中的常見問題及解決方法