SpringBoot实现热部署的三种方式
作者:Myovlmx
热部署,就是不需要停掉服务,可以线上改,改完立马生效。
1.为什么用热部署?
因为不启用热部署时每次更改java数据都要重启服务器影响开发效率。
2.热部署的实现原理?
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
3. 热部署的实现方式
1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run启动
<!--实现热部署--> <!--devtools热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency>
然后在Settings→Build→Compiler中将Build project automatically勾选上,最后按ctrl+shift+alt+/ 选择registy,将compiler.automake.allow.when.app.running勾选。另外,对于某些idea没有这个选项的,设置好其他的之后,ctrl+f9也是可以的。
(1) devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),
实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。
即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的
(2)配置了true后在修改java文件后也就支持了自动部署,不过这种方式是属于项目重启,会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。
2.使用springloaded本地加载启动,配置jvm参数
-javaagent:<jar包地址> -noverify
3.使用devtools工具包,操作简单,但是每次需要重新部署
1、引入devtools依赖
在你的pom.xml配置文件中,引入devtools依赖包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
提示:
设置optional 为true,是避免大家微服务项目父子项目依赖继承冲突。
2、devtools的配置
spring: devtools: restart: enabled: true #设置开启热部署,false即不开启热部署 additional-paths: src/main/java #指定热部署的目录 exclude: test/** #指定目录不更新
3、Intellij Idea修改
如果你是使用的idea工具开发,那你还需要改以下两个地方:
1、勾上自动编译或者手动重新编译 File -> Setting -> Build, Execution, Deployment -> Compiler:勾选 [Build project automatically]
演示截图如下:
2、注册 Shift+Ctrl+Alt+/(Windows快捷键), 单击[Registry],勾选 [compiler.automake.allow.when.app.running]
快捷键:Shift+Ctrl+Alt+/ 后,会弹出如下界面:
然后单击 Registry,找到 [compiler.automake.allow.when.app.running]把它勾选上。具体演示如下:
到此,以上就完成了热部署的所有配置啦,你们记得配置完成后,重启idea!让所有配置都生效。
再次,若想验证热部署是否生效,你们可以做个简单测试(比如随便修改个接口地址啥的,然后用新接口地址去访问,验证修改代码是否在不手动启动项目的情况下生效等),我这里就不给大家演示了。
同时,如下是我从网上看到的一些注意事项,经实测确实如此,也希望大家在使用热部署的同时,也能少走些弯路。
具体如下:
- package 打包时,不包含devtools工具。
- 生产环境devtools将被禁用,如java -jar方式或者自定义的类加载器等都会识别为生产环境。
- devtools会在windows资源管理器占用java进程,在开发工具里面杀不掉,只能手动kill掉,不然重启会选成端口被占用情况。
- Thymeleaf无需配置spring.thymeleaf.cache: false,devtools默认会自动设置。
到此这篇关于SpringBoot实现热部署的三种方式的文章就介绍到这了,更多相关SpringBoot 热部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!