Spring Boot Idea中熱部署(自動刷新)

在Idea中開發Spring Boot項目,每當修改內容之後,都需要點一下重啟來進行重新發布,比較繁瑣。針對這個問題Spring Boot中提供了一個devtools的工具項目,可以幫助我們完成自動刷新,熱部署的功能。

本文給大家提供兩種形式的熱部署操作,下面看具體的操作。

引入依賴

在項目中引入devtools的pom依賴:

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-devtools/<artifactid>
<optional>true/<optional>
/<dependency>
/<code>

需要注意的是optional要設置為true。

為了測試頁面,效果,我們同時引入了web和Thymeleaf相關的依賴:

<code><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>
/<code>

Build中配置

在原來默認的Build插件中添加configration配置,用於讓devtools生效。

<code><build>
<plugins>
<plugin>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-maven-plugin/<artifactid>
<configuration>

<fork>true/<fork>
/<configuration>
/<plugin>
/<plugins>
/<build>
/<code>

Idea配置

在Idea配置中找到Complier選擇,勾選其中的“Build Project automatically”。

Spring Boot Idea中熱部署(自動刷新)

配置該項的主要作用就是讓Idea可以自動Build項目。

但Idea自動Build項目還是有條件的,也就是說此處配置自動構建並不代表可以在任何情況下都可以自動構建。

當Idea檢測到應用程序正在執行(running)的時候,是不會進行構建的。

所以還需要後續的操作進行熱部署。

手動熱部署

經過以上步驟之後,如果你習慣使用快捷鍵,而想達到改好一批代碼之後,自主控制熱部署,那可以使用快捷鍵或點擊“Build”中的“Build Project”就行構建項目,實現熱部署。

就像上面說的,雖然設置了自動構建,但是當項目運行時並不會自動構建,那就需要我們手動去構建。

Spring Boot Idea中熱部署(自動刷新)

當點擊完成之後,日誌中就會打印熱部署相關的信息。

此種方式適合,批量的,完成一整塊功能之後,進行熱部署。

自動熱部署

那麼如何實現改一行代碼就進行一次熱部署呢?這還需要再次修改Idea。就像上面說的,把Idea改成即使項目正在運行(running)也運行進行構建。

具體配置就在打開Registry,勾選“Compiler autoMake allow when app running”選項,然後最後重啟一下Idea。自動熱部署便生效了。修改完代碼,每隔幾秒鐘,便會重新部署一下。

那麼,如何打開Registry呢?在Windows操作系統下快捷鍵為“ctrl + shift + alt + /”。

Spring Boot Idea中熱部署(自動刷新)

Mac操作系統下,默認好像沒有。不過如果你不知道快捷鍵是什麼也沒關係。直接在Idea配置中找到對應的配置項,設置一個快捷鍵即可。

Spring Boot 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中配置類似如下禁止緩存的配置:

<code>spring.thymeleaf.cache=false
/<code>

上面以thymeleaf的配置為例,其他配置雷同。生產發佈時,再將其去掉。


分享到:


相關文章: