天天看點

spring-boot 速成(2) devtools之熱部署及LiveReload

一、添加 devtools依賴

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

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

spring-boot 速成(2) devtools之熱部署及LiveReload

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

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

3.1 Keymap -> Other -> Maintenance

spring-boot 速成(2) devtools之熱部署及LiveReload

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

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

spring-boot 速成(2) devtools之熱部署及LiveReload

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

然後關掉,大工告成。現在隻要代碼一修改,然後儲存,就會實時觸發編譯,并重新加載,實作了不重新開機的熱部署,開發調試時十分友善。

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

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

spring-boot 速成(2) devtools之熱部署及LiveReload

另外,一些靜态資源,比如圖檔,css樣式,js腳本檔案,如果内容修改了,也有可能觸發自動重新開機,預設情況下META-INF/resources、resources、static、public、templates等幾個目錄的内容已經被devtools排除在外了(即:這些目錄下的檔案變化,不會觸發自動重新開機),具體可以檢視spring-boot的源碼:org.springframework.boot.devtools.autoconfigure.DevToolsProperties.Restart#DEFAULT_RESTART_EXCLUDES

spring-boot 速成(2) devtools之熱部署及LiveReload

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

  

關于LiveReload

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

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

spring-boot 速成(2) devtools之熱部署及LiveReload

那麼,浏覽器怎麼做到實時與LiveReload的Service保持實時内容同步呢?當然,要安裝插件,chrome的應用商店裡搜尋LiveReload免費插件安裝即可(需要反搶,你懂的),在調試時,隻要激活該插件,頁面就會與LiveReload建立websocket的長連結,參考下圖:

spring-boot 速成(2) devtools之熱部署及LiveReload

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

spring-boot 速成(2) devtools之熱部署及LiveReload

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

參考文章:

<a href="http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools" target="_blank">http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools</a>