在SpringBoot中使用热部署(DevTools)


### 一、简介

  有时候我们开发完SpringBoot项目后,启动运行。但是经常发现代码需要反复修改,然后修改部分内容后需要再启动,这样太费时了,热部署就是用来解决这一问题。让你修改完代码后,能自动执行编译并运行。


### 二、使用SpringBoot的devtools实现热部署

Devtools的原理

  深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
  spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是热部署。该模块在完整的打包环境下运行的时候会被禁用。如果你使用 java -jar启动应用或者用一个特定的 classloader 启动,它会认为这是一个“生产环境”。

1.修改pom文件

加入spring-boot-devtools依赖和spring-boot-maven-plugin插件

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
	</dependency>
</dependencies>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<fork>true</fork>
			</configuration>
		</plugin>
	</plugins>
</build>

#### 2.修改idea配置

当我们修改了Java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译。

(1)依次点开菜单 【File】->【Settings】->【Build,Execution,Deployment】->【Compiler】: 勾选右侧的【Build project automatically】

(2)按下Ctrl+Shift+A,打开搜索,输入registry,并打开搜索到的该项设置

(3)找到compiler.automake.allow.when.app.running项,并打勾

(4)重启IDEA


3.修改项目配置文件 (可忽略)

在application.properties中配置spring.devtools.restart.enabled=false,此时restart类加载器还会初始化,但不会监视文件更新。在SprintApplication.run之前调用System.setProperty("spring.devtools.restart.enabled", "false");可以完全关闭重启支持。

#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude: WEB-INF/**

注:关于devtools可以自定义很多属性,达到自定义效果。


4.测试

  • 修改类–>保存:应用会重启
  • 修改配置文件–>保存:应用会重启
  • 修改页面–>保存:应用不会重启,但会重新加载,页面会刷新(原理是将spring.thymeleaf.cache设为false,参考:Spring Boot配置模板引擎)
原文地址:https://www.cnblogs.com/kancy/p/11691537.html