Spring boot 熱部署(springloader)
在編寫代碼的時(shí)候奶躯,你會(huì)發(fā)現(xiàn)我們只是簡單把打印信息改變了买喧,就需要重新部署馋袜,如果是這樣的編碼方式简逮,那么我們估計(jì)一天下來就真的是打幾個(gè)Hello World就下班了旨巷。那么如何解決熱部署的問題呢巨缘?那就是springloaded
打開pom.xml導(dǎo)入依賴包
<build>
<plugins>
<!--在這里添加springloader plugin-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
修改IDEA工具配置
由于熱部署是監(jiān)聽 Class 文件的變化,它自身不會(huì)主動(dòng)去編譯 Java 文件采呐,所以我們得在 Java 文件改動(dòng)時(shí)若锁,自動(dòng)編譯成 Class 文件,然后熱部署工具創(chuàng)造的新的類加載器才會(huì)加載改變后的 Class 文件斧吐。所以又固,如果你使用 IDEA 開發(fā)工具的話,記得要把自動(dòng)編譯打開煤率。
CTRL + SHIFT + A --> 查找make project automatically --> 選中
CTRL + SHIFT + A --> 查找Registry --> 找到并勾選compiler.automake.allow.when.app.running
運(yùn)行方法一:使用spring-boot:run
- 需要配置一下maven的path下的環(huán)境變量
- 運(yùn)行通過IEDA的命令窗口輸入mvn spring-boot:run命令啟動(dòng)
運(yùn)行成功打開頁面測(cè)試類
修改測(cè)試類的返回值直接刷新頁面看有沒有改變
@RestController
public class HellController {
@RequestMapping("/hello")
public String hello(){
return "hello123";
}
}
發(fā)生改變測(cè)試成功
運(yùn)行方法二:使用run as – java application
第二種方式跟以前一樣通過mian函數(shù)啟動(dòng)只是需要進(jìn)行一些修改,因?yàn)榈谝环N啟動(dòng)方式容易出現(xiàn)停止后java進(jìn)程沒有關(guān)閉的情況發(fā)生
- 把spring-loader-1.2.8.RELEASE.jar下載下來仰冠,放到項(xiàng)目的lib目錄中
- 修改IDEA中run參數(shù)
- 給VM options添加參數(shù)
-javaagent:.\src\main\webapp\WEB-INF\lib\springloaded-1.2.8.RELEASE.jar -noverify
- 啟動(dòng)main函數(shù)驗(yàn)證跟上面驗(yàn)證方法一樣
Springboot使用devtools進(jìn)行熱部署
通過使用springloaded進(jìn)行熱部署,但是些代碼修改了或者添加一個(gè)新的方法蝶糯,并不會(huì)進(jìn)行熱部署洋只。這里我們要用導(dǎo)devtools
- spring-boot-devtools 是一個(gè)為開發(fā)者服務(wù)的一個(gè)模塊,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去。原理是在發(fā)現(xiàn)代碼有更改之后木张,重新啟動(dòng)應(yīng)用众辨,但是速度比手動(dòng)停止后再啟動(dòng)還要更快,更快指的不是節(jié)省出來的手工操作的時(shí)間舷礼。
- 其深層原理是使用了兩個(gè)ClassLoader鹃彻,一個(gè)Classloader加載那些不會(huì)改變的類(第三方Jar包),另一個(gè)ClassLoader加載會(huì)更改的類,稱為 restart ClassLoader
- 這樣在有代碼更改的時(shí)候妻献,原來的restart ClassLoader 被丟棄蛛株,重新創(chuàng)建一個(gè)restart ClassLoader,由于需要加載的類相比較少育拨,所以實(shí)現(xiàn)了較快的重啟時(shí)間(5秒以內(nèi))
修改IDEA工具配置
由于熱部署是監(jiān)聽 Class 文件的變化谨履,它自身不會(huì)主動(dòng)去編譯 Java 文件,所以我們得在 Java 文件改動(dòng)時(shí)熬丧,自動(dòng)編譯成 Class 文件笋粟,然后熱部署工具創(chuàng)造的新的類加載器才會(huì)加載改變后的 Class 文件。所以析蝴,如果你使用 IDEA 開發(fā)工具的話害捕,記得要把自動(dòng)編譯打開。
CTRL + SHIFT + A --> 查找make project automatically --> 選中
CTRL + SHIFT + A --> 查找Registry --> 找到并勾選compiler.automake.allow.when.app.running
打開pom.xml導(dǎo)入依賴包
<!--這是Spring boot devtools 熱部署依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!-- 使用myeclipse需要添加這個(gè)插件IDEA可以不用添加-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
測(cè)試方法
- 修改類或者新建類-->保存:應(yīng)用會(huì)重啟
- 修改配置文件-->保存:應(yīng)用會(huì)重啟
- 修改頁面-->保存:應(yīng)用會(huì)重啟闷畸,頁面會(huì)刷新(原理是將)
spring.thymeleaf.cache設(shè)為false(后面的博客會(huì)寫到)
說明
- devtools會(huì)監(jiān)聽classpath下的文件變動(dòng)尝盼,并且會(huì)立即重啟應(yīng)用(發(fā)生在保存時(shí)機(jī)),注意:因?yàn)槠洳捎玫奶摂M機(jī)機(jī)制佑菩,該項(xiàng)重啟是很快的盾沫。
- devtools可以實(shí)現(xiàn)頁面熱部署(即頁面修改后會(huì)立即生效,這個(gè)可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實(shí)現(xiàn)(這里注意不同的模板配置不一樣)
不成功分析
- 對(duì)應(yīng)的spring-boot版本是否正確殿漠,這里使用的是1.4.1版本赴精;
- myeclipse是否加入plugin以及屬性<fork>true</fork>
- 是否修改了IDEA的配置
- 如果設(shè)SpringApplication.setRegisterShutdownHook(false),則自動(dòng)重啟將不起作用绞幌。