導讀:
本文主要說說,在玩spring-boot時,我們經常要遇到重啟服務這種浪費時間的事情,為了割掉這個痛點,我們一般有2中方式實現。
一個是springload , 另外一個是 spring-boot-devtools
方式1:springload
springload 的Maven配置為如下:
spring-loaded是一個開源項目,項目地址:https://github.com/spring-projects/spring-loaded
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <!-- spring熱部署--> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
當系統通過 mvn spring-boot:run啟動或者 右鍵application debug 啟動Java文件時,系統會監視classes文件,當有classes文件被改動時,系統會重新加載類文件,不用重啟啟動服務
ps:需要重新編譯文件 ctl+shift+f9
方式2:dev-tools
maven工程使用spring-boot-devtools進行熱部署,更改代碼避免重啟web容器 .
<!-- devtools可以實現頁面熱部署(即頁面修改后會立即生效,這個可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實現), 實現類文件熱部署(類文件修改后不會立即生效),實現對屬性文件的熱部署。 即devtools會監聽classpath下的文件變動,並且會立即重啟應用(發生在保存時機),注意:因為其采用的虛擬機機制,該項重啟是很快的 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional><!-- optional=true,依賴不會傳遞,該項目依賴devtools;之后依賴myboot項目的項目如果想要使用devtools,需要重新引入 --> </dependency>
spring-boot-devtools 是一個為開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。相關Blog: 點擊打開鏈接
原理是在發現代碼有更改之后,重新啟動應用,但是比速度比手動停止后再啟動還要更快,更快指的不是節省出來的手工操作的時間。
其深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱為 restart ClassLoader
,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啟時間(5秒以內)。
由於devtools僅在 Spring milestone repository. 倉庫中提供,而默認的倉庫版本是1.2.5.RELEASE,所以需要在POM.XML 文件中配置倉庫地址。
