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中啟用項目自動構建
三、idea中compiler.automake.allow.when.app.running 屬性更改為true
這個選項很隱蔽,特別是在mac上,正確的尋寶姿勢如下(一般人我不告訴他):
3.1 Keymap -> Other -> 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
文章列表