在Idea中開發Spring Boot專案,每當修改內容之後,都需要點一下重啟來進行重新發布,比較繁瑣。針對這個問題Spring Boot中提供了一個devtools的工具專案,可以幫助我們完成自動重新整理,熱部署的功能。
本文給大家提供兩種形式的熱部署操作,下面看具體的操作。
引入依賴在專案中引入devtools的pom依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional></dependency>
需要注意的是optional要設定為true。
為了測試頁面,效果,我們同時引入了web和Thymeleaf相關的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
Build中配置
在原來預設的Build外掛中新增configration配置,用於讓devtools生效。
配置該項的主要作用就是讓Idea可以自動Build專案。
但Idea自動Build專案還是有條件的,也就是說此處配置自動構建並不代表可以在任何情況下都可以自動構建。
當Idea檢測到應用程式正在執行(running)的時候,是不會進行構建的。
所以還需要後續的操作進行熱部署。
手動熱部署經過以上步驟之後,如果你習慣使用快捷鍵,而想達到改好一批程式碼之後,自主控制熱部署,那可以使用快捷鍵或點選“Build”中的“Build Project”就行構建專案,實現熱部署。
就像上面說的,雖然設定了自動構建,但是當專案執行時並不會自動構建,那就需要我們手動去構建。
此種方式適合,批量的,完成一整塊功能之後,進行熱部署。
自動熱部署那麼如何實現改一行程式碼就進行一次熱部署呢?這還需要再次修改Idea。就像上面說的,把Idea改成即使專案正在執行(running)也執行進行構建。
具體配置就在開啟Registry,勾選“Compiler autoMake allow when app running”選項,然後最後重啟一下Idea。自動熱部署便生效了。修改完程式碼,每隔幾秒鐘,便會重新部署一下。
那麼,如何開啟Registry呢?在Windows作業系統下快捷鍵為“ctrl + shift + alt + /”。
Mac作業系統下,預設好像沒有。不過如果你不知道快捷鍵是什麼也沒關係。直接在Idea配置中找到對應的配置項,設定一個快捷鍵即可。
在KeyMap中搜索“Registry”,找到對應的選項,然後檢視或配置對應的快捷鍵即可。
這裡我們顧名思義“Compiler autoMake allow when app running”,就是當app在執行時也執行自動編譯構建。
兩種方案對比上面已經提到第一種方案可以自主控制,而第二種方案呢由Idea自動進行編譯處理。
個人推薦第一種方案,比例不停的重啟,不停的部署。
Devtools的基本原理深層原理是使用了兩個ClassLoader。一個Classloader載入那些不會改變的類(第三方Jar包),另一個ClassLoader載入會更改的類,稱為restart ClassLoader。
當代碼有改動時,舊的restart ClassLoader被丟棄,重新建立一個restart ClassLoader,由於需要載入的類相比較少,相對於完全重啟就節省了時間。
其他另外需要注意,如果你使用了像Freemarker或Thymeleaf這樣的模板引擎,還需要在application.properties中配置類似如下禁止快取的配置:
spring.thymeleaf.cache=false上面以thymeleaf的配置為例,其他配置雷同。生產釋出時,再將其去掉。