IDEA代码热部署和热加载的三种实现方案

 更新时间:2023年11月16日 09:46:41   作者:ReturnTmp  
在日常开发中,我们需要经常修改 Java 代码,手动重启项目,查看修改后的效果,如果在项目小时,重启速度比较快,等待的时间是较短的,我们可以使用代码热加载和热部署解决该问题,本文给大家介绍了三种实现方案,需要的朋友可以参考下

前言

在日常开发中,我们需要经常修改 Java 代码,手动重启项目,查看修改后的效果。如果在项目小时,重启速度比较快,等待的时间是较短的。但是随着项目逐渐变大,重启的速度变慢,等待时间 1-2 min 是比较常见的

我们可以使用代码热加载和热部署解决该问题,目前实现方案主要有如下三种

spring-boot-devtools【不推荐】IDEA 自带 HowSwap 功能【推荐】JRebel 插件【最推荐】

严格意义上,我们需要区分下热部署和热加载

热部署在服务器运行时重新部署项目,即直接重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间

热加载在在运行时重新加载类,从而升级应用。热加载的实现原理主要依赖 java 的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。对比反射机制,反射是在运行时获取类信息,通过动态的调用来改变程序行为;热加载则是在运行时通过重新加载改变类信息,直接改变程序行为

spring-boot-devtools

注:本种方式重新加载速度过慢,不推荐

pom.xml 添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional> <!-- 可以防止将devtools依赖传递到其他模块中 -->
    </dependency>
</dependencies>

我们使用 IDEA 可以有两种启动方式

手动重启

无任何配置时,当我们启动应用之后,可以手动触发重启更新(Ctrl+F9),也可以使用 mvn compile 编译触发重启更新

虽然这样可以减少加载时间,但是依旧是需要手动启动的,不太方便,所以可以使用如下自动重启方式

自动重启

首先需要按照如下步骤开启 IDEA 运行时编译

配置如下允许自动构建项目

image.png

然后再配置允许运行时重启

image.png

配置 application.yml

spring:
  devtools:
    restart:
      enabled: true  #设置开启热部署
      additional-paths: src/main/java #重启目录
      exclude: WEB-INF/**
  thymeleaf:
    cache: false #使用Thymeleaf模板引擎,关闭缓存

其实理论上来说,devtool 本身基于重启方式,这种仍然不是真正的热替换方案,所以实际开发中慎用

如果自动重启的开销和手动重启没有什么太大差别,那么还不如手动重启(按需重启)

多数情况下,如果是方法内部的修改或者静态资源的修改,在 IDEA 中是可以通过 Rebuild(Ctrl + Shift + F9)进行热更的

HowSwap

该功能是 IDEA Ultimate 旗舰版的专属功能,不支持 IDEA Community 社区版

设置 Spring Boot 启动类,开启 HotSwap 功能,之后 Debug 运行该启动类,等待项目启动完成。
之后每次修改 Java 代码后,点击左下角的「热加载」按钮,即可实现代码热加载。

image.png

image.png

IDEA 自带 HowSwap 功能,支持比较有限,很多修改都不支持。例如说:

  • 只能增加方法或字段但不可以减少方法或字段
  • 只能增加可见性不能减少
  • 只能维持已有方法的签名而不能修改等等。

简单来说,只支持方法内的代码修改热加载,所以如果想要相对完美的方案,建议使用 JRebel 插件

JRebel

JRebel 安装配置及激活方式有如下两种

方法 1

注:该方法实测失败,请使用方法 2 (但是方法 2 需要参考方法 1)

直接从 IDEA 插件市场安装插件

image.png

image.png

安装 JRebel 插件后,注册地址填写激活网址 + 生成的 GUID,邮箱随便填写,然后直接激活即可

激活网址列表,尽量用排序靠前的

http://jrebel-license.jiweichengzhu.com/{GUID}

https://jrebel.qekang.com/{GUID}

GUID 可以使用如下地址在线生成,然后替换上面的{GUID}就行

GUID 生成在线链接:在线GUID随机生成工具-Bejson.com

邮箱地址可随便输入,选择我同意,最后提交即可

image.png

方法 2

下载链接:JRebel and XRebel - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)

首先手动下载  2022.4.1 版本插件压缩包,然后在 IDEA 中手动从磁盘中安装插件

image.png

安装完成之后重启,之后按照如下步骤进行,之后的激活网址和邮箱参照方法 1 方法填写即可

image.png

image.png

然后点击「Work Offline」按钮,设置 JRebel 为离线,避免因为网络问题导致激活失效

image.png

如何使用

注:使用 JRebel 同样需要进行上面 spring-boot-devtools 中 settings 中的配置。如果前面不配置,首次运行 JRebel 会自动提醒,并且询问是否自动开启,到时候点击"是"即可自动配置

image.png

之后我们每次修改代码后,保存后都会自动热加载,当然如果想要手动更新点击刷新图标按钮即可

以上就是IDEA代码热部署和热加载的三种实现方案的详细内容,更多关于IDEA代码热部署和热加载的资料请关注脚本之家其它相关文章!

相关文章

  • java 创建线程的四种方式

    java 创建线程的四种方式

    这篇文章主要介绍了java 创建线程的四种方式,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • Redis Spring配置集群过程

    Redis Spring配置集群过程

    这篇文章主要介绍了Redis Spring配置集群过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • RabbitMQ中的死信队列(Dead Letter Exchanges)详解

    RabbitMQ中的死信队列(Dead Letter Exchanges)详解

    这篇文章主要介绍了RabbitMQ中的死信队列(Dead Letter Exchanges)详解,当RabbitMQ出现死信,可能会导致业务逻辑错误,比如下订单后修改库存操作,在下单后因为某种原因,发送的消息未被签收,这时库存数据会出现不一致,需要的朋友可以参考下
    2023-12-12
  • Java面向对象程序设计多态性示例

    Java面向对象程序设计多态性示例

    这篇文章主要介绍了Java面向对象程序设计多态性,结合实例形式分析了java多态性的概念、原理、定义与使用方法及相关注意事项,需要的朋友可以参考下
    2018-03-03
  • MyBatis中resultMap和resultType的区别详解

    MyBatis中resultMap和resultType的区别详解

    这篇文章主要介绍了MyBatis中resultMap和resultType的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • idea配置检查XML中SQL语法及书写sql语句智能提示的方法

    idea配置检查XML中SQL语法及书写sql语句智能提示的方法

    idea连接了数据库,也可以执行SQL查到数据,但是无法识别sql语句中的表导致没有提示,下面这篇文章主要给大家介绍了关于idea配置检查XML中SQL语法及书写sql语句智能提示的相关资料,需要的朋友可以参考下
    2023-03-03
  • Java Springboot 重要知识点整理汇总

    Java Springboot 重要知识点整理汇总

    Spring Boot作为微服务中最好的Java框架,本文主要为大家整理汇总了七个Spring Boot的重要知识点,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • Java日常练习题,每天进步一点点(33)

    Java日常练习题,每天进步一点点(33)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • java高并发InterruptedException异常引发思考

    java高并发InterruptedException异常引发思考

    这篇文章主要为大家介绍了java高并发InterruptedException异常引发思考,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • VSCode搭建Java开发环境的超详细步骤

    VSCode搭建Java开发环境的超详细步骤

    VSCode是一款多平台的源代码编辑器,支持多种编程语言,它轻量级、功能强大,通过丰富的插件生态系统可以支持更多语言和运行时,如C++、C#、Java、Python等,这篇文章主要介绍了VSCode搭建Java开发环境的超详细步骤,需要的朋友可以参考下
    2024-10-10

最新评论