熱部署,就是在應用正在運行的時候升級軟件,卻不需要重新啓動應用。在平時編寫代碼的時候,你會發現我們只是簡單把打印信息改變了,就需要重新部署,如果要改變這樣的方式,就需要用到熱部署springloaded。
使用方式,在項目中的pom.xml中plugin裏添加依賴:
<dependencies>
<!--springloaded hot deploy -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
如果使用的run as,Java application的話,那麼需要做如下處理:
把spring-loader-1.2.4.RELEASE.jar下載下來,放到項目的lib目錄中,點擊下載:
CSDN下載地址:http://download.csdn.net/download/a78270528/9950708
然後設置MyEclipse的run參數裏VM參數,點擊Java Application-->HelloController-->Arguments。
填寫springloaded-1.2.4.RELEASE.jar路徑“-javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify”。
點擊run 即可運行項目,再次修改java文件即時生效,我們修改方法的返回值,這樣在run as的時候,也能進行熱部署了。直接訪問就可以得到修改後的結果了。
這裏要注意的是,使用springloader這種方式,這並不是所有的代碼都能夠熱部署的。使用devtools這種方式可以實現大部分代碼的熱部署。
spring-boot-devtools 是一個爲開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。原理是在發現代碼有更改之後,重新啓動應用,但是速度比手動停止後再啓動還要更快,更快指的不是節省出來的手工操作的時間。
其深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱爲 restart ClassLoader
,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啓時間(5秒以內)。
使用方法:
<!-- spring boot devtools 依賴包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
把上面的pom.xml中的pulgin替換成下面的代碼:<!-- 構建節點-->
<build>
<plugins>
<!-- 這是spring boot devtool plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--fork : 如果沒有該項配置,肯呢個devtools不會起作用,即應用不會restart -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
配置完成,重新啓動項目可以試着修改代碼,熱部署成功,方便手動重啓的時間,也加快了開發速度。
說明:
1、devtools會監聽classpath下的文件變動,並且會立即重啓應用(發生在保存時機),注意:因爲其採用的虛擬機機制,該項重啓是很快的。
2、devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實現(這裏注意不同的模板配置不一樣)。
在修改以下代碼都不需要重啓服務器:修改類、配置文件、頁面文件(原理是將spring.thymeleaf.cache設爲false)之後ctrl+s:應用會重啓。
如果不能使用的話,以下就幾種常見的問題:
1、對應的spring-boot版本是否正確,這裏使用的是1.5.3版本;
2、是否加入plugin以及屬性<fork>true</fork>
3、Eclipse Project 是否開啓了Build Automatically(開啓自動編譯的功能)。
4、如果設置SpringApplication.setRegisterShutdownHook(false),則自動重啓將不起作用。
最後,這兩種方式springloader、devtools只需要配置一種即可,建議使用devtools,可以支持更多的代碼熱部署。