欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot实现热部署

程序员文章站 2022-03-19 16:01:59
1. 前言在实际开发中,每次修改代码就需要重启项目,重新部署,对于一系而大型应用来说重启需要大量的时间,碎玉一个后端开发者来说,重启确实很难受。在java开发领域,热部署一直是一个难以解决的问题,目前java虚拟机只能实现方法体的热部署,对于整个类的结构修改,仍然需要重启项目,对于类重新加载才能实现项目的更新操作。2. 原理深层原理是使用了两个ClassLoader,一个ClassLoader架子啊哪些不会改变的类(第三方jar),另一个ClassLoader加载会更改的类,称为restart....

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

SpringBoot实现热部署

SpringBoot实现热部署

4.4 测试

  • 修改类–>保存:应用会重启
  • 修改配置文件–>保存:应用会重启
  • 修改页面–>保存:应用不会重启,但会重新加载,页面会刷新
  • 5. 参考资料&小结

    小结

    热部署有三种方式,我被网上的各种博客搞得晕头转向的,本来不是个难问题,越看越复杂。最近有点自闭,对于敲代码这件事来说,我不知道我到底喜不喜欢,还是只是单纯为了找工作,我看着别人敲的代码,感觉自己与别人差距还很大,我觉得自己非常菜,我不知道我要是以后固定的工作,固定的敲代码,会不会还有进步。自闭中。。。

    参考资料

    其他两种热部署方式请参考最后一个链接

  • 深入探索 Java 热部署
  • SpringBoot配置devtools实现热部署
  • spring boot热部署的三种方式

本文地址:https://blog.csdn.net/weixin_42210904/article/details/111947510

相关标签: spring boot