前言
平時(shí)開(kāi)發(fā)Sprig Boot的時(shí)候纸巷,經(jīng)常改動(dòng)個(gè)小小的地方就要重新啟動(dòng)項(xiàng)目粥喜,這無(wú)疑是一種很差的體驗(yàn)乘凸。在此,博主收集了3種熱部署的方案供大家選擇党远。
正文
目前博主用過(guò)的有三種:
- Spring Loaded
- spring-boot-devtools
- JRebel插件
博主開(kāi)發(fā)環(huán)境
- 系統(tǒng):win10
- 開(kāi)發(fā)工具:IDE:IntelliJ IDEA 2017.1
- spring-boot版本:1.5.3RELEASE
- JDK:1.8
Spring Loaded 實(shí)現(xiàn)熱部署
Spring Loaded是一個(gè)用于在JVM運(yùn)行時(shí)重新加載類文件更改的JVM代理,Spring Loaded允許你動(dòng)態(tài)的新增/修改/刪除某個(gè)方法/字段/構(gòu)造方法,同樣可以修改作用在類/方法/字段/構(gòu)造方法上的注解.也可以新增/刪除/改變枚舉中的值削解。
spring-loaded是一個(gè)開(kāi)源項(xiàng)目,項(xiàng)目地址:https://github.com/spring-projects/spring-loaded
Spring Loaded有兩種方式實(shí)現(xiàn),分別是Maven引入依賴方式或者添加啟動(dòng)參數(shù)方式
Maven依賴方式
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
</plugin>
啟動(dòng):mvn spring-boot:run
如果你也是IDEA的話沟娱,直接界面上雙擊運(yùn)行即可氛驮,如下圖
注意:maven依賴的方式只適合spring-boot:run的啟動(dòng)方式,右鍵那種方式不行济似。
出現(xiàn)如下配置表實(shí)配置成功:
[INFO] Attaching agents: [C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar]
添加啟動(dòng)參數(shù)方式
這種方式是右鍵運(yùn)行啟動(dòng)類
首先先下載對(duì)應(yīng)的springloaded-1.2.6.RELEASE.jar矫废,可以去上面提到的官網(wǎng)獲取
博主這里直接引用maven依賴已經(jīng)下載好的路徑哈
然后打開(kāi)下圖所示的Edit Configurations配置,在VM options中輸入:
-javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify
然后直接右鍵運(yùn)行啟動(dòng)類即可啟動(dòng)項(xiàng)目砰蠢。
上面2種方式小伙伴隨便選擇一種即可,當(dāng)系統(tǒng)通過(guò) mvn spring-boot:run啟動(dòng)或者 右鍵application debug啟動(dòng)Java文件時(shí)蓖扑,系統(tǒng)會(huì)監(jiān)視classes文件,當(dāng)有classes文件被改動(dòng)時(shí)台舱,系統(tǒng)會(huì)重新加載類文件律杠,不用重啟啟動(dòng)服務(wù)。
注:IDEA下需要重新編譯文件 Ctrl+Shift+F9或者編譯項(xiàng)目 Ctrl+F9
如何測(cè)試熱部署是否可用呢竞惋,你可以先寫個(gè)簡(jiǎn)單的Controller方法俩功,返回個(gè)字符串,然后啟動(dòng)項(xiàng)目碰声,接著修改下這個(gè)方法返回的字符串诡蜓,Ctrl+Shift+F9編譯下當(dāng)前類,然后再刷新下頁(yè)面看看是否內(nèi)容改變了胰挑。
在 Spring Boot蔓罚,模板引擎的頁(yè)面默認(rèn)是開(kāi)啟緩存,如果修改頁(yè)面內(nèi)容瞻颂,刷新頁(yè)面是無(wú)法獲取修改后的頁(yè)面內(nèi)容豺谈,所以,如果我們不需要模板引擎的緩存贡这,可以進(jìn)行關(guān)閉茬末。
spring.freemarker.cache=false
spring.thymeleaf.cache=false
spring.velocity.cache=false
經(jīng)過(guò)博主簡(jiǎn)單的測(cè)試,發(fā)現(xiàn)大多數(shù)情況可以使用熱部署,有效的解決了文章頭部中提到的那個(gè)痛點(diǎn)丽惭,不過(guò)還是有一些情況下需要重新啟動(dòng)击奶,不可用的情況如下:
1:對(duì)于一些第三方框架的注解的修改,不能自動(dòng)加載责掏,比如:spring mvc的@RequestMapping
2:application.properties的修改也不行
3:log4j的配置文件的修改不能即時(shí)生效
spring-boot-devtools 實(shí)現(xiàn)熱部署
spring-boot-devtools為應(yīng)用提供一些開(kāi)發(fā)時(shí)特性柜砾,包括默認(rèn)值設(shè)置,自動(dòng)重啟换衬,livereload等痰驱。
想要使用devtools熱部署功能,maven添加依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
將依賴關(guān)系標(biāo)記為可選<optional>true</optional>
是一種最佳做法瞳浦,可以防止使用項(xiàng)目將devtools傳遞性地應(yīng)用于其他模塊担映。
默認(rèn)屬性
在Spring Boot集成Thymeleaf時(shí),spring.thymeleaf.cache
屬性設(shè)置為false可以禁用模板引擎編譯的緩存結(jié)果叫潦。
現(xiàn)在另萤,devtools會(huì)自動(dòng)幫你做到這些,禁用所有模板的緩存诅挑,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等四敞。
更多的屬性,請(qǐng)參考DevToolsPropertyDefaultsPostProcessor拔妥。
自動(dòng)重啟
自動(dòng)重啟的原理在于spring boot使用兩個(gè)classloader:不改變的類(如第三方j(luò)ar)由base類加載器加載忿危,正在開(kāi)發(fā)的類由restart類加載器加載。應(yīng)用重啟時(shí)没龙,restart類加載器被扔掉重建铺厨,而base類加載器不變,這種方法意味著應(yīng)用程序重新啟動(dòng)通常比“冷啟動(dòng)”快得多硬纤,因?yàn)閎ase類加載器已經(jīng)可用并已填充解滓。
所以,當(dāng)我們開(kāi)啟devtools后筝家,classpath中的文件變化會(huì)導(dǎo)致應(yīng)用自動(dòng)重啟洼裤。
當(dāng)然不同的IDE效果不一樣,Eclipse中保存文件即可引起classpath更新(注:需要打開(kāi)自動(dòng)編譯)溪王,從而觸發(fā)重啟腮鞍。而IDEA則需要自己手動(dòng)CTRL+F9重新編譯一下(感覺(jué)IDEA這種更好,不然每修改一個(gè)地方就重啟莹菱,好蛋疼)
排除靜態(tài)資源文件
靜態(tài)資源文件在改變之后有時(shí)候沒(méi)必要觸發(fā)應(yīng)用程序重啟移国,例如thymeleaf模板文件就可以實(shí)時(shí)編輯,默認(rèn)情況下道伟,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的資源不會(huì)觸發(fā)重啟迹缀,而是觸發(fā)live reload(devtools內(nèi)嵌了一個(gè)LiveReload server,當(dāng)資源發(fā)生改變時(shí),瀏覽器刷新,下面會(huì)介紹)祝懂。
可以使用spring.devtools.restart.exclude屬性配置票摇,例如
spring.devtools.restart.exclude=static/**,public/**
如果想保留默認(rèn)配置,同時(shí)增加新的配置嫂易,則可使用
spring.devtools.restart.additional-exclude屬性
觀察額外的路徑
如果你想觀察不在classpath中的路徑的文件變化并觸發(fā)重啟兄朋,則可以配置 spring.devtools.restart.additional-paths 屬性掐禁。
不在classpath內(nèi)的path可以配置spring.devtools.restart.additionalpaths屬性來(lái)增加到監(jiān)視中怜械,同時(shí)配置spring.devtools.restart.exclude可以選擇這些path的變化是導(dǎo)致restart還是live reload。
關(guān)閉自動(dòng)重啟
設(shè)置 spring.devtools.restart.enabled 屬性為false傅事,可以關(guān)閉該特性缕允。可以在application.properties中設(shè)置蹭越,也可以通過(guò)設(shè)置環(huán)境變量的方式障本。
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
使用一個(gè)觸發(fā)文件
若不想每次修改都觸發(fā)自動(dòng)重啟,可以設(shè)置spring.devtools.restart.trigger-file指向某個(gè)文件响鹃,只有更改這個(gè)文件時(shí)才觸發(fā)自動(dòng)重啟驾霜。
自定義自動(dòng)重啟類加載器
默認(rèn)時(shí),IDE中打開(kāi)的項(xiàng)目都會(huì)由restart加載器加載买置,jar文件由Base加載器加載粪糙,但是若你使用multi-module的項(xiàng)目,并且不是所有模塊都被導(dǎo)入到IDE中忿项,此時(shí)會(huì)導(dǎo)致加載器不一致蓉冈。這時(shí)你可以創(chuàng)建META-INF/spring-devtools.properties文件,并增加restart.exclude.XXX轩触,restart.include.XXX來(lái)配置哪些jar被restart加載寞酿,哪些被base加載。如:
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
LiveReload
DevTools內(nèi)置了一個(gè)LiveReload服務(wù),可以在資源變化時(shí)用來(lái)觸發(fā)瀏覽器刷新脱柱。當(dāng)然這個(gè)需要你瀏覽器安裝了LiveReload插件伐弹,并且啟動(dòng)這個(gè)插件才行。很有意思榨为,這里介紹下如何弄掸茅。
先去谷歌商店安裝LiveReload插件,自己準(zhǔn)備梯子柠逞。
安裝好在要自動(dòng)刷新的頁(yè)面點(diǎn)擊下圖中圖標(biāo)昧狮,啟動(dòng)應(yīng)用后更新頁(yè)面內(nèi)容或者css等都會(huì)觸發(fā)頁(yè)面自動(dòng)刷新了。如下圖板壮,圈中的就是逗鸣,點(diǎn)一下會(huì)變黑就是啟動(dòng)了。
最后展示效果,修改完html頁(yè)面后撒璧,Ctrl+Shift+F9,沒(méi)有重啟透葛,頁(yè)面也會(huì)自動(dòng)刷新了,太有趣了卿樱。
如果您不想在應(yīng)用程序運(yùn)行時(shí)啟動(dòng)LiveReload服務(wù)器僚害,則可以將spring.devtools.livereload.enabled屬性設(shè)置為false。
一次只能運(yùn)行一個(gè)LiveReload服務(wù)器繁调。開(kāi)始應(yīng)用程序之前萨蚕,請(qǐng)確保沒(méi)有其他LiveReload服務(wù)器正在運(yùn)行。
如果你的IDE啟動(dòng)多個(gè)應(yīng)用程序蹄胰,則只有第一個(gè)應(yīng)用程序?qū)⒅С諰iveReload岳遥。
JRebel插件方式
在IDEA中打開(kāi)插件管理界面,按照下面的提示先安裝上
安裝完插件后裕寨,需要去獲取正版的激活碼浩蓉,這個(gè)可以直接去官網(wǎng)https://my.jrebel.com獲取(需自備梯子)
1:通過(guò)fackbook登錄,沒(méi)有就去注冊(cè)一個(gè)
2:填寫一些資料后(資料必須填寫完整,否則JRebel激活不了)宾袜,復(fù)制激活碼即可
3:重啟IDEA后捻艳,在IDEA的Settings中找到JRebel輸入復(fù)制的激活碼即可
出現(xiàn)綠色,即表示激活成功了庆猫。
4: 接著就如下所示认轨,勾中JRebel方式后啟動(dòng)即可,即可享受JRebel帶來(lái)的超爽體驗(yàn)
總結(jié)
以上就是平時(shí)Spring Boot開(kāi)發(fā)種使用的熱部署方式阅悍,小伙伴可以自己試試喜歡哪種就用哪種好渠。
后面2種可能需要梯子,程序員應(yīng)該都自備梯子翻墻了吧节视,如果沒(méi)有可以找博主拳锚,博主和朋友合租了一臺(tái)服務(wù)器安裝代理,有需要的可以找我提供服務(wù)~ 穩(wěn)定速度快寻行,youtube上1080視頻很流暢霍掺。你可以私信或者微信公眾號(hào)后臺(tái)留言皆可。
一直覺(jué)得自己寫的不是技術(shù)拌蜘,而是情懷杆烁,一篇篇文章是自己這一路走來(lái)的痕跡〖蛭裕靠專業(yè)技能的成功是最具可復(fù)制性的兔魂,希望我的這條路能讓你少走彎路,希望我能幫你抹去知識(shí)的蒙塵举娩,希望我能幫你理清知識(shí)的脈絡(luò)析校,希望未來(lái)技術(shù)之巔上有你也有我构罗。