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部署中的常見問題及解決方法