Spring Boot 菜鳥教程 5 熱部署 devtools模組
阿新 • • 發佈:2019-01-07
GitHub
devtools模組
devtools模組,是為開發者服務的一個模組。主要的功能就是程式碼修改後一般在5秒之內就會自動重新載入至伺服器,相當於restart成功。
原理分析
簡單原理
在發現程式碼有更改之後,自動重新啟動應用,但是其速度比手動停止後再啟動還要快些,更快這裡指的不是節省出來的手工操作的時間。
底層原理:雙類載入器機制
- 一個Base ClassLoader載入器,用於載入不會改變的第三方依賴的jar;
- 另一個Restart ClassLoader載入器,用於載入自己編寫的類;
- 執行流程:當應用重啟後,原先的Restart ClassLoader被丟掉、重新new一個Restart ClassLoader來載入這些修改過的東西,而Base ClassLoader卻沒有變化。這就是devtools重啟速度快的原因。
注意事項
- pom.xml裡面plugin不配置fork=true實測也是可以的
- application.properties需要配置:新增那個目錄的檔案需要restart
spring.devtools.restart.additional-paths=src/main/java
專案圖片
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" >
<modelVersion>4.0.0</modelVersion>
<groupId>com.jege.spring.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-mybatis</name >
<url>http://maven.apache.org</url>
<!-- 公共spring-boot配置,下面依賴jar檔案不用在寫版本號 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 熱部署 -->
<!-- devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties檔案中配置spring.thymeleaf.cache=false來實現) -->
<!-- 實現類檔案熱部署(類檔案修改後不會立即生效),實現對屬性檔案的熱部署。 -->
<!-- 即devtools會監聽classpath下的檔案變動,並且會立即重啟應用(發生在儲存時機),注意:因為其採用的虛擬機器機制,該項重啟是很快的 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- optional=true,依賴不會傳遞,該專案依賴devtools;之後依賴boot專案的專案如果想要使用devtools,需要重新引入 -->
<optional>true</optional>
</dependency>
</dependencies>
<build>
<finalName>spring-boot-devtools</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 如果沒有該項配置,實際測試ok -->
<!-- <fork>true</fork> -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置檔案application.properties
#新增那個目錄的檔案需要restart
spring.devtools.restart.additional-paths=src/main/java
#排除那個目錄的檔案不需要restart
spring.devtools.restart.exclude=static/**,public/**
控制器HelloController
package com.jege.spring.boot.devtools;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author JE哥
* @email [email protected]
* @description:看看devtools模組的快速
*/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// System.out.println("test");
return "Hello World";
}
}
執行
- 執行Application之後,修改HelloController,可以看到快速重啟,載入即時生效
擴充套件
- 如果覺得不過癮,還可以去試試使用Spring Loaded或JRebel專案
原始碼地址
如果覺得我的文章或者程式碼對您有幫助,可以請我喝杯咖啡。
您的支援將鼓勵我繼續創作!謝謝!