- 在项目开发中,热部署能给我们带来极大的便利,spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,借助它我们就再也无需手动重启Spring Boot应用,提高开发开发效率。
- devtools的原理:
其底层原理是分别使用了两个ClassLoader来加载动态和静态数据:
其中一个Classloader加载那些不会改变的类(主要是三方Jar包)。
另一个ClassLoader加载会更改的类,称为Restart ClassLoader,这样在有代码更改的时候,旧的Restart ClassLoader被丢弃,创建一个新的Restart ClassLoader,由这个新的加载器来加载动态资源,由于需要加载的类相比较少,所以重启较快。
- 项目依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>runtime</scope>
</dependency>
</dependencies>
- 项目配置
#热部署生效
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
#设置重启的目录
spring.devtools.restart.additional-paths=src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude: WEB-INF/**
说明:
(1) devtools可以实现:
- 页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现)。
- 类文件热部署(类文件修改后不会立即生效)。
- 属性文件的热部署:即devtools会监听classpath下的文件变动。
- 上述文件保存时会触发重加载(受idea的自动保存动作的延后影响,触发时机可能有所延后),而后才重启应用。因虚拟机实例并未停机,整个重启过程是还很快的(通过查看应用的进程id,与手动重启相比,热加载的进程id不变,证明热加载前后使用的是同一个虚拟机实例)。
(2)配置了后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。
devtools的配置
在application.properties中配置spring.devtools.restart.enabled=false,此时restart类加载器还会初始化,但不会监视文件更新。
在SprintApplication.run之前调用System.setProperty(“spring.devtools.restart.enabled”, “false”);可以完全关闭热加载功能。
- IDEA配置:
当我们修改了Java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译:
- File -> Settings -> 勾选Compiler-Build Project automatically。
- 使用组合热键【ctrl + shift + alt + /】,在弹框中选择Registry,勾选Compiler autoMake allow when app running。
- 测试一下:
修改类–>保存:应用会重启
修改配置文件–>保存:应用会重启
修改页面–>保存:应用不会重启,但会重新加载,页面会刷新(原理是将spring.thymeleaf.cache设为false,参考:Spring Boot配置模板引擎)
学习使我充实,分享给我快乐!