Spring Boot:(十)開發常用的熱部署方式彙總

前言

平時開發Sprig Boot的時候,經常改動個小小的地方就要重新啓動項目,這無疑是一種很差的體驗。在此,博主收集了3種熱部署的方案供大家選擇。本文爲轉載內容:Spring Boot乾貨系列:(十)開發常用的熱部署方式彙總

正文

目前博主用過的有三種:

  • 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是一個開源項目,項目地址:https://github.com/spring-projects/spring-loaded

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

Maven依賴方式

1
2
3
4
5
6
7
8
9
10
11
<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的話,直接界面上雙擊運行即可,如下圖

Paste_Image.png

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

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

1
[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中輸入:

1
-javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify

Paste_Image.png

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

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

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

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

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

1
2
3
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添加依賴如下:

1
2
3
4
5
6
7
<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屬性配置,例如

1
spring.devtools.restart.exclude=static/**,public/**

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

1
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中設置,也可以通過設置環境變量的方式。

1
2
3
4
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加載。如:

1
2
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

LiveReload

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

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

Paste_Image.png

安裝好在要自動刷新的頁面點擊下圖中圖標,啓動應用後更新頁面內容或者css等都會觸發頁面自動刷新了。如下圖,圈中的就是,點一下會變黑就是啓動了。

Paste_Image.png

最後展示效果,修改完html頁面後,Ctrl+Shift+F9,沒有重啓,頁面也會自動刷新了,太有趣了。

livereload.gif

如果您不想在應用程序運行時啓動LiveReload服務器,則可以將spring.devtools.livereload.enabled屬性設置爲false。

一次只能運行一個LiveReload服務器。開始應用程序之前,請確保沒有其他LiveReload服務器正在運行。
如果你的IDE啓動多個應用程序,則只有第一個應用程序將支持LiveReload。

JRebel插件方式

在IDEA中打開插件管理界面,按照下面的提示先安裝上

Paste_Image.png

安裝完插件後,需要去獲取正版的激活碼,這個可以直接去官網https://my.jrebel.com獲取(需自備梯子)

1:通過fackbook登錄,沒有就去註冊一個

image

2:填寫一些資料後(資料必須填寫完整,否則JRebel激活不了),複製激活碼即可

image

3:重啓IDEA後,在IDEA的Settings中找到JRebel輸入複製的激活碼即可

Paste_Image.png

出現綠色,即表示激活成功了。
Paste_Image.png
4: 接着就如下所示,勾中JRebel方式後啓動即可,即可享受JRebel帶來的超爽體驗

Paste_Image.png

總結

以上就是平時Spring Boot開發中常用的熱部署方式,小夥伴可以自己試試喜歡哪種就用哪種。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章