文章出處

JRebel熱部署插件相信很多人都知道,但是這是一款商業插件,spring-boot框架也提供了類似的功能,即:devtools,關鍵是免費的! 使用方法如下:

一、添加 devtools依賴

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-devtools')
    compileOnly('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}  

只要添加org.springframework.boot:spring-boot-devtools 依賴項即可。

 

二、idea中啟用項目自動構建
開啟項目自動build

 

三、idea中compiler.automake.allow.when.app.running 屬性更改為true

這個選項很隱蔽,特別是在mac上,正確的尋寶姿勢如下(一般人我不告訴他):

3.1 Keymap -> Other -> Maintenance

Maintenance

記下這個快捷鍵: shift + option + command + / 

3.2 回到idea主窗口,按下這4個神奇的組合鍵

3.3 再找到compiler.automake.allow.when.app.running 選項,將它打開

 

然后關掉,大工告成。現在只要代碼一修改,然后保存,就會實時觸發編譯,并重新加載,實現了不重啟的熱部署,開發調試時十分方便。

但是,如果每個java源代碼,隨便改點東西,就頻繁自動編譯、重新加載,開銷也比較大,也可以參考下面的設置:

server:
  port: 9090 #服務器端口
  context-path: "/jimmy" #context-path
spring:
  main:
    banner-mode: "off"
  devtools:
    restart:
      trigger-file: .trigger

注意最后的trigger-file: .trigger,這表示只有resources/META-INF/.trigger的內容變化時,才會觸發重新編譯及加載

 

另外,一些靜態資源,比如圖片,css樣式,js腳本文件,如果內容修改了,也有可能觸發自動重啟,默認情況下META-INF/resources、resources、static、public、templates等幾個目錄的內容已經被devtools排除在外了(即:這些目錄下的文件變化,不會觸發自動重啟),具體可以查看spring-boot的源碼:org.springframework.boot.devtools.autoconfigure.DevToolsProperties.Restart#DEFAULT_RESTART_EXCLUDES

如果你的靜態資源不在幾個標準目錄里(比如webresource),就必須手動排除了,類似這樣:

spring:
  main:
    banner-mode: "off"
  devtools:
    restart:
      trigger-file: .trigger
      exclude: /webresouce/**

  

關于LiveReload

spring-boot-devtools提供的另一項特別有用的功能就是LiveReload,常規web開發中,如果修改了css/javascript/html等前端內容,至少得刷新下頁面,才能看到最新效果,而LiveReload則可以讓開發人員,在任何編輯器中,只要修改了源代碼(比如:將某個標題設置成紅色),網頁就實時做出相應的響應(即:字變紅),不需要刷新。

秘密就在于spring-boot-devtools在應用啟動時,自帶了一個LiveReload Service,參考下面的截圖:

 

那么,瀏覽器怎么做到實時與LiveReload的Service保持實時內容同步呢?當然,要安裝插件,chrome的應用商店里搜索LiveReload免費插件安裝即可(需要反搶,你懂的),在調試時,只要激活該插件,頁面就會與LiveReload建立websocket的長鏈接,參考下圖:

同時,如果查看本機建立的livereload端口連接情況,也可以印證這一點:

不過要注意的是,spring-boot項目重啟時,偶爾發現瀏覽器與liveReload的連接不會及時關閉,導致端口被占用,最終項目重啟失敗,另外,如果idea同時啟動多個webapplication,只有第1個啟動的應用會有LiveReload Server,后面的應用livereload不管用(這也很容易理解,如果1臺機器上有多個livereload server,瀏覽器的livereload 插件,估計也不太好判斷該連哪個web socket)

 

參考文章:

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()