SpringBoot实现热部署的三种方式

 更新时间:2023年12月26日 15:26:27   作者:Myovlmx  
本文主要介绍了SpringBoot实现热部署的三种方式,主要包括配置pom.xml文件,使用插件的执行命令mvn spring-boot:run启动项,使用springloader本地启动修改jvm参数,使用devtools工具包,感兴趣的可以了解一下

热部署,就是不需要停掉服务,可以线上改,改完立马生效。

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 热部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中super关键字的用法和细节

    Java中super关键字的用法和细节

    大家好,本篇文章主要讲的是Java中super关键字的用法和细节,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Springboot整合RabbitMq测试TTL的方法详解

    Springboot整合RabbitMq测试TTL的方法详解

    这篇文章主要介绍了Springboot整合RabbitMq测试TTL的设置,设置TTL一般由两种设置方法,设置整个队列的过期时间另一种设置单个消息的过期时间,通过示例图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SpringBoot打印Banner的实现示例

    SpringBoot打印Banner的实现示例

    本文主要介绍了SpringBoot启动Banner的实现原理和打印流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Spring中的BeanFactory对象实例化工厂详解

    Spring中的BeanFactory对象实例化工厂详解

    这篇文章主要介绍了Spring中的BeanFactory对象实例化工厂详解,BeanFactory及其子类是Spring IOC容器中最重要的一个类,BeanFactory由类名可以看出其是一个Bean工厂类,其实它确实是一个Bean工厂类,完成Bean的初始化操作,需要的朋友可以参考下
    2023-12-12
  • HashMap确定key的存储位置的源码分析

    HashMap确定key的存储位置的源码分析

    HashMap 作为 Java 中最常用的数据结构之一,用于存储和管理键值对,HashMap 基于哈希函数实现,能通过将 key 映射到特定的位置来实现快速存储、查找和删除数据,接下来将从源码角度分析以通俗易懂的方式向大家讲解一下 HashMap 如何确定 key 的存储位置的
    2023-07-07
  • Spring框架中的跨域CORS配置的完整教学

    Spring框架中的跨域CORS配置的完整教学

    CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种机制,允许在浏览器中向不同源(域名、协议或端口不同)的服务器发起请求,下面我们就来看看如何在Spring框架配置跨域CORS吧
    2025-10-10
  • spring注入配置文件属性到java类

    spring注入配置文件属性到java类

    这篇文章主要为大家介绍了spring注入配置文件属性到java类实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java利用Netty时间轮实现延时任务

    Java利用Netty时间轮实现延时任务

    时间轮是一种可以执行定时任务的数据结构和算法。本文将为大家详细讲解一下Java如何利用Netty时间轮算法实现延时任务,感兴趣的小伙伴可以了解一下
    2022-08-08
  • @FeignClient之name,value,url详解

    @FeignClient之name,value,url详解

    在FeignClient中,`name`用于指定服务的名称,通常与服务注册中心中的服务名关联,而`url`用于指定请求的基础URL,适用于不使用服务注册的场景,如果同时配置了`name`和`url`,则`url`会优先生效,Feign会直接使用`url`指定的地址
    2024-11-11
  • Java Idea TranslationPlugin翻译插件使用解析

    Java Idea TranslationPlugin翻译插件使用解析

    这篇文章主要介绍了Java Idea TranslationPlugin翻译插件使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论