SpringBoot實現(xiàn)熱部署的三種方式
熱部署,就是不需要停掉服務(wù),可以線上改,改完立馬生效。
1.為什么用熱部署?
因為不啟用熱部署時每次更改java數(shù)據(jù)都要重啟服務(wù)器影響開發(fā)效率。
2.熱部署的實現(xiàn)原理?
深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱為restart ClassLoader,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創(chuàng)建一個restart ClassLoader,由于需要加載的類相比較少,所以實現(xiàn)了較快的重啟時間。
3. 熱部署的實現(xiàn)方式
1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run啟動
<!--實現(xiàn)熱部署-->
<!--devtools熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
然后在Settings→Build→Compiler中將Build project automatically勾選上,最后按ctrl+shift+alt+/ 選擇registy,將compiler.automake.allow.when.app.running勾選。另外,對于某些idea沒有這個選項的,設(shè)置好其他的之后,ctrl+f9也是可以的。
(1) devtools可以實現(xiàn)頁面熱部署(即頁面修改后會立即生效,這個可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實現(xiàn)),
實現(xiàn)類文件熱部署(類文件修改后不會立即生效),實現(xiàn)對屬性文件的熱部署。
即devtools會監(jiān)聽classpath下的文件變動,并且會立即重啟應(yīng)用(發(fā)生在保存時機),注意:因為其采用的虛擬機機制,該項重啟是很快的
(2)配置了true后在修改java文件后也就支持了自動部署,不過這種方式是屬于項目重啟,會清空session中的值,也就是如果有用戶登陸的話,項目重啟后需要重新登陸。
2.使用springloaded本地加載啟動,配置jvm參數(shù)
-javaagent:<jar包地址> -noverify
3.使用devtools工具包,操作簡單,但是每次需要重新部署
1、引入devtools依賴
在你的pom.xml配置文件中,引入devtools依賴包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>提示:
設(shè)置optional 為true,是避免大家微服務(wù)項目父子項目依賴繼承沖突。
2、devtools的配置
spring:
devtools:
restart:
enabled: true #設(shè)置開啟熱部署,false即不開啟熱部署
additional-paths: src/main/java #指定熱部署的目錄
exclude: test/** #指定目錄不更新3、Intellij Idea修改
如果你是使用的idea工具開發(fā),那你還需要改以下兩個地方:
1、勾上自動編譯或者手動重新編譯 File -> Setting -> Build, Execution, Deployment -> Compiler:勾選 [Build project automatically]
演示截圖如下:

2、注冊 Shift+Ctrl+Alt+/(Windows快捷鍵), 單擊[Registry],勾選 [compiler.automake.allow.when.app.running]
快捷鍵:Shift+Ctrl+Alt+/ 后,會彈出如下界面:

然后單擊 Registry,找到 [compiler.automake.allow.when.app.running]把它勾選上。具體演示如下:

到此,以上就完成了熱部署的所有配置啦,你們記得配置完成后,重啟idea!讓所有配置都生效。
再次,若想驗證熱部署是否生效,你們可以做個簡單測試(比如隨便修改個接口地址啥的,然后用新接口地址去訪問,驗證修改代碼是否在不手動啟動項目的情況下生效等),我這里就不給大家演示了。
同時,如下是我從網(wǎng)上看到的一些注意事項,經(jīng)實測確實如此,也希望大家在使用熱部署的同時,也能少走些彎路。
具體如下:
- package 打包時,不包含devtools工具。
- 生產(chǎn)環(huán)境devtools將被禁用,如java -jar方式或者自定義的類加載器等都會識別為生產(chǎn)環(huán)境。
- devtools會在windows資源管理器占用java進程,在開發(fā)工具里面殺不掉,只能手動kill掉,不然重啟會選成端口被占用情況。
- Thymeleaf無需配置spring.thymeleaf.cache: false,devtools默認會自動設(shè)置。
到此這篇關(guān)于SpringBoot實現(xiàn)熱部署的三種方式的文章就介紹到這了,更多相關(guān)SpringBoot 熱部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中super關(guān)鍵字的用法和細節(jié)
大家好,本篇文章主要講的是Java中super關(guān)鍵字的用法和細節(jié),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Springboot整合RabbitMq測試TTL的方法詳解
這篇文章主要介紹了Springboot整合RabbitMq測試TTL的設(shè)置,設(shè)置TTL一般由兩種設(shè)置方法,設(shè)置整個隊列的過期時間另一種設(shè)置單個消息的過期時間,通過示例圖文相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下2022-03-03
Java利用Netty時間輪實現(xiàn)延時任務(wù)
時間輪是一種可以執(zhí)行定時任務(wù)的數(shù)據(jù)結(jié)構(gòu)和算法。本文將為大家詳細講解一下Java如何利用Netty時間輪算法實現(xiàn)延時任務(wù),感興趣的小伙伴可以了解一下2022-08-08
Java Idea TranslationPlugin翻譯插件使用解析
這篇文章主要介紹了Java Idea TranslationPlugin翻譯插件使用解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-04-04

