SpringBoot实现热部署
1. 前言
在实际开发中,每次修改代码就需要重启项目,重新部署,对于一系而大型应用来说重启需要大量的时间,碎玉一个后端开发者来说,重启确实很难受。在java开发领域,热部署一直是一个难以解决的问题,目前java虚拟机只能实现方法体的热部署,对于整个类的结构修改,仍然需要重启项目,对于类重新加载才能实现项目的更新操作。
2. 原理
深层原理是使用了两个ClassLoader,一个ClassLoader架子啊哪些不会改变的类(第三方jar),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样子啊代码额更改的时候,原来的restart ClassLoader会被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相对比较少,所以实现了快速重启。
若想探究底层实现或者自定义加载类,可以参考大佬博客
3. 方式
3.springboot实现热部署有3种方式:
1.使用springboot配置pom.xml文件,使用mvn spring-boot:run启动;
2.使用springloader本地启动修改jvm参数;
-javaagent:<jar包地址> -noverify
3.使用devtools工具包,操作简单,但是每次需要重新部署。
这里主要讲解一下第三种热部署方式的使用,因为在网上查找资源时,总会发现很多人就是springloaded和devtools都使用了,其实是多余的操作,而且第三种操作简单快捷。
4. 开始配置
4.1 在pom.xml中添加依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies>
注:
(1)devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),
实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。
即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的。
(2)配置了true后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。
默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)
4.2 devtools的配置
spring:
devtools:
restart:
enabled: true #设置开启热部署
additional-paths: src/main/java #重启目录
exclude: WEB-INF/**
freemarker:
cache: false #页面不加载缓存,修改即时生效
4.3 IDEA中配置
当我们修改了类文件后,idea不会自动编译,得修改idea设置。
- (1)File-Settings-Compiler-Build Project automatically
- (2)ctrl + shift + alt + / ,选择Registry,勾上 Compiler autoMake allow when app running
4.4 测试
- 修改类–>保存:应用会重启
- 修改配置文件–>保存:应用会重启
- 修改页面–>保存:应用不会重启,但会重新加载,页面会刷新
-
5. 参考资料&小结
小结
热部署有三种方式,我被网上的各种博客搞得晕头转向的,本来不是个难问题,越看越复杂。最近有点自闭,对于敲代码这件事来说,我不知道我到底喜不喜欢,还是只是单纯为了找工作,我看着别人敲的代码,感觉自己与别人差距还很大,我觉得自己非常菜,我不知道我要是以后固定的工作,固定的敲代码,会不会还有进步。自闭中。。。
参考资料
其他两种热部署方式请参考最后一个链接
- 深入探索 Java 热部署
- SpringBoot配置devtools实现热部署
- spring boot热部署的三种方式
本文地址:https://blog.csdn.net/weixin_42210904/article/details/111947510
推荐阅读
-
SpringBoot中快速实现邮箱发送代码解析
-
spring boot devtools在Idea中实现热部署方法
-
Spring Boot 配置 IDEA和DevTools 热部署的方法
-
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
-
SpringBoot CountDownLatch多任务并行处理的实现方法
-
SpringBoot 多任务并行+线程池处理的实现
-
C#基于Quartz.NET实现任务调度并部署Windows服务
-
Python实现根据指定端口探测服务器/模块部署的方法
-
SpringBoot整合Elasticsearch7.2.0的实现方法
-
SpringBoot AOP方式实现多数据源切换的方法