原本地址:Spring Boot乾貨系列:(十)開發常用的熱部署方式彙總
部落格地址:tengj.top/
前言
平時開發Sprig Boot的時候,經常改動個小小的地方就要重新啟動專案,這無疑是一種很差的體驗。在此,博主收集了3種熱部署的方案供大家選擇。
正文
目前博主用過的有三種:
- Spring Loaded
- spring-boot-devtools
- JRebel外掛
博主開發環境
- 系統:win10
- 開發工具:IDE:IntelliJ IDEA 2017.1
- spring-boot版本:1.5.3RELEASE
- JDK:1.8
Spring Loaded 實現熱部署
Spring Loaded是一個用於在JVM執行時重新載入類檔案更改的JVM代理,Spring Loaded允許你動態的新增/修改/刪除某個方法/欄位/構造方法,同樣可以修改作用在類/方法/欄位/構造方法上的註解.也可以新增/刪除/改變列舉中的值。
spring-loaded是一個開源專案,專案地址:github.com/spring-proj…
Spring Loaded有兩種方式實現,分別是Maven引入依賴方式或者新增啟動引數方式
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>
複製程式碼
啟動:mvn spring-boot:run
如果你也是IDEA的話,直接介面上雙擊執行即可,如下圖
注意:maven依賴的方式只適合spring-boot:run的啟動方式,右鍵那種方式不行。
出現如下配置表實配置成功:
[INFO] Attaching agents: [C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar]
複製程式碼
新增啟動引數方式
這種方式是右鍵執行啟動類 首先先下載對應的springloaded-1.2.6.RELEASE.jar,可以去上面提到的官網獲取 博主這裡直接引用maven依賴已經下載好的路徑哈
然後開啟下圖所示的Edit Configurations配置,在VM options中輸入:
-javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify
複製程式碼
然後直接右鍵執行啟動類即可啟動專案。
上面2種方式小夥伴隨便選擇一種即可,當系統通過 mvn spring-boot:run啟動或者 右鍵application debug啟動Java檔案時,系統會監視classes檔案,當有classes檔案被改動時,系統會重新載入類檔案,不用重啟啟動服務。
注:IDEA下需要重新編譯檔案 Ctrl+Shift+F9或者編譯專案 Ctrl+F9
如何測試熱部署是否可用呢,你可以先寫個簡單的Controller方法,返回個字串,然後啟動專案,接著修改下這個方法返回的字串,Ctrl+Shift+F9編譯下當前類,然後再重新整理下頁面看看是否內容改變了。
在 Spring Boot,模板引擎的頁面預設是開啟快取,如果修改頁面內容,重新整理頁面是無法獲取修改後的頁面內容,所以,如果我們不需要模板引擎的快取,可以進行關閉。
spring.freemarker.cache=false
spring.thymeleaf.cache=false
spring.velocity.cache=false
複製程式碼
經過博主簡單的測試,發現大多數情況可以使用熱部署,有效的解決了文章頭部中提到的那個痛點,不過還是有一些情況下需要重新啟動,不可用的情況如下: 1:對於一些第三方框架的註解的修改,不能自動載入,比如:spring mvc的@RequestMapping 2:application.properties的修改也不行 3:log4j的配置檔案的修改不能即時生效
spring-boot-devtools 實現熱部署
spring-boot-devtools為應用提供一些開發時特性,包括預設值設定,自動重啟,livereload等。
想要使用devtools熱部署功能,maven新增依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
複製程式碼
將依賴關係標記為可選<optional>true</optional>
是一種最佳做法,可以防止使用專案將devtools傳遞性地應用於其他模組。
預設屬性
在Spring Boot整合Thymeleaf時,spring.thymeleaf.cache
屬性設定為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.exclude屬性配置,例如
spring.devtools.restart.exclude=static/**,public/**
複製程式碼
如果想保留預設配置,同時增加新的配置,則可使用
spring.devtools.restart.additional-exclude屬性
複製程式碼
觀察額外的路徑
如果你想觀察不在classpath中的路徑的檔案變化並觸發重啟,則可以配置 spring.devtools.restart.additional-paths 屬性。
不在classpath內的path可以配置spring.devtools.restart.additionalpaths屬性來增加到監視中,同時配置spring.devtools.restart.exclude可以選擇這些path的變化是導致restart還是live reload。
關閉自動重啟
設定 spring.devtools.restart.enabled 屬性為false,可以關閉該特性。可以在application.properties中設定,也可以通過設定環境變數的方式。
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
複製程式碼
使用一個觸發檔案
若不想每次修改都觸發自動重啟,可以設定spring.devtools.restart.trigger-file指向某個檔案,只有更改這個檔案時才觸發自動重啟。
自定義自動重啟類載入器
預設時,IDE中開啟的專案都會由restart載入器載入,jar檔案由Base載入器載入,但是若你使用multi-module的專案,並且不是所有模組都被匯入到IDE中,此時會導致載入器不一致。這時你可以建立META-INF/spring-devtools.properties檔案,並增加restart.exclude.XXX,restart.include.XXX來配置哪些jar被restart載入,哪些被base載入。如:
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
複製程式碼
LiveReload
DevTools內建了一個LiveReload服務,可以在資源變化時用來觸發瀏覽器重新整理。當然這個需要你瀏覽器安裝了LiveReload外掛,並且啟動這個外掛才行。很有意思,這裡介紹下如何弄。
先去谷歌商店安裝LiveReload外掛,自己準備梯子。
安裝好在要自動重新整理的頁面點選下圖中圖示,啟動應用後更新頁面內容或者css等都會觸發頁面自動重新整理了。如下圖,圈中的就是,點一下會變黑就是啟動了。
最後展示效果,修改完html頁面後,Ctrl+Shift+F9,沒有重啟,頁面也會自動重新整理了,太有趣了。
如果您不想在應用程式執行時啟動LiveReload伺服器,則可以將spring.devtools.livereload.enabled屬性設定為false。
一次只能執行一個LiveReload伺服器。開始應用程式之前,請確保沒有其他LiveReload伺服器正在執行。 如果你的IDE啟動多個應用程式,則只有第一個應用程式將支援LiveReload。
JRebel外掛方式
在IDEA中開啟外掛管理介面,按照下面的提示先安裝上
安裝完外掛後,需要去獲取正版的啟用碼,這個可以直接去官網my.jrebel.com獲取(需自備梯子)
1:通過fackbook登入,沒有就去註冊一個
2:填寫一些資料後(資料必須填寫完整,否則JRebel啟用不了),複製啟用碼即可
3:重啟IDEA後,在IDEA的Settings中找到JRebel輸入複製的啟用碼即可
出現綠色,即表示啟用成功了。
4: 接著就如下所示,勾中JRebel方式後啟動即可,即可享受JRebel帶來的超爽體驗總結
以上就是平時Spring Boot開發種使用的熱部署方式,小夥伴可以自己試試喜歡哪種就用哪種。
一直覺得自己寫的不是技術,而是情懷,一篇篇文章是自己這一路走來的痕跡。靠專業技能的成功是最具可複製性的,希望我的這條路能讓你少走彎路,希望我能幫你抹去知識的蒙塵,希望我能幫你理清知識的脈絡,希望未來技術之巔上有你也有我。
訂閱博主微信公眾號:嘟爺java超神學堂(javaLearn):
- 獲取最新博主部落格更新資訊,首發公眾號
- 獲取大量視訊,電子書,精品破解軟體資源