1 原理
平常开发项目时,修改了Java代码或者配置文件之后,需要手动重启项目才能生效。所谓的热部署就是在修改了后端代码之后不需要手动重启,工具会帮你快速的自动重启使修改生效。
pring-boot-devtools模块能够实现热部署。深层原理是使用了两个ClassLoader
,一个Classloader加载那些不会改变的类(第三方Jar包)
,另一个ClassLoader加载会更改的类,称为restart ClassLoader
。这样在有代码更改的时候,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因其采用的虚拟机机制,所以重启是很快的。
2 演示环境
- IDEA 2019
- Spring Boot Maven项目
3 操作步骤
3.1 在pom.xml文件中添加依赖
<!--引入热部署插件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- 设置只在运行时起作用 ,打包时不打进去,默认为runtime -->
<scope>runtime</scope>
<!-- 设置不能被其它模块继承,如果多个子模块可以去掉 ,不必须 -->
<optional>true</optional>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果要加此项,必须设置为true 非必须-->
<!-- 支持静态文件热部署 非必须 -->
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
完整pm.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nobody</groupId>
<artifactId>springboot-devtools</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-devtools</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入热部署插件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- 设置只在运行时起作用 ,打包时不打进去,默认为runtime -->
<scope>runtime</scope>
<!-- 设置不能被其它模块继承(即表示依赖不会传递),如果多个子模块可以去掉 ,非必须 -->
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果要加此项,必须设置为true 非必须-->
<!-- 支持静态文件热部署 非必须 -->
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.2 IDEA设置
使用ctrl+shift+a
快捷键搜索Registry,选择搜索出来的第一个,找到compiler.automake.allow.when.app.running
,勾上开启此功能。
4 配置文件说明
如果我们想对热部署进行一些设置,可以在application.properties文件(或者application.yml)添加一些属性变量来修改。
server.port=8081
#主要配置
#是否启用自动重启功能
spring.devtools.restart.enabled=true
#重启服务的文件夹目录
spring.devtools.restart.additional-paths=src/main/java
#不重启服务的文件夹配置
spring.devtools.restart.exclude=META-INF/maven/**,META-INF/resouces/**,resources/**, static/**,public/**,templates/**,**/*Test.class,**/*Tests.class,git.properties
#非主要配置
#是否启用一个livereload.com兼容的服务器
#spring.devtools.livereload.enabled=true
#端口livereload.com服务器端口
#spring.devtools.livereload.port=35729
#在原理来的基础上新增不重启服务的文件夹目录
#spring.devtools.restart.additional-exclude=
#设置对路径变化进行监测的时间间隔(以毫秒为单位)
#spring.devtools.restart.poll-interval=1000
#在没有改变任何classpath的情况下,在重启被触发前的静默时长(以毫秒为单位)
#spring.devtools.restart.quiet-period=400
#设置触发条件,当需要实际触发重启检查时,则需要修改这个文件
#spring.devtools.restart.trigger-file=