一、前言
在我们平常在使用idea做项目时,像修改了一些html等文件时,我们可以直接点一下右上角的小锤子,页面就可以发生相应改变了,不需要重启整个项目。
但是当我们修改一个class文件时,每次修改后就得将项目重启,重新部署,对于一些大型应用来说,重启时会耗费大量的时间成本。对于我们后端开发者来说,等待项目重启的过程无疑是非常难受。在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机也仅仅是只能实现方法体修改的热部署,但对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。
注意:也就是说目前的热部署技术仅限于更改class文件,如果添加了java文件我们还是得乖乖重启项目了。
二、热部署原理
热部署实现的深层原理就是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
三、开始配置
这里我们使用devtools工具包实现,操作更简单。
1、首先在pom文件中添加依赖
<!--devtools实现热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
注意:
(1) devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),
实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。
即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因为其采用的虚拟机机制,该项重启是很快的。
(2)配置了true后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。
(3)另外默认情况下,/META-INF/maven,/META-
INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。
2、devtools的配置
在application.yml中配置一下devtools。
spring:
devtools:
restart:
enabled: true #设置开启热部署
additional-paths: src/main/java #重启目录
exclude: WEB-INF/**
freemarker:
cache: false #页面不加载缓存,修改即时生效
3、IDEA配置
当我们修改了类文件后,idea不会自动编译,得修改idea设置。
(1)File-Settings-Compiler-Build Project automatically
(2)ctrl + shift + alt + / ,选择Registry,勾上 Compiler autoMake allow when app running
4、测试
修改类–>保存:应用会重启
修改配置文件–>保存:应用会重启
修改页面–>保存:应用不会重启,但会重新加载,页面会刷新。