包里替换class文件_为了让Tomcat支持热替换,我直接修改了他的源码

2023-11-19

前言

又是一个周日,贫穷的我依然使用电源适配器来暖手,所以,这章来我们聊聊"热"这个问题。

啊啊啊啊啊啊.....

不知道各位网友是怎么解决修改代码后,「不重启」立即生效对的,如果在Spring Boot项目中,可能有部分人会加入spring-boot-devtools这个依赖,当代码修改后,Spring Boot项目会自动重启,注意是重启项目,当然还有些坑,比如不生效,或者改完代码后过好长一段时间才生效,这样还不如手动点一下重启按钮呢,再有就是,如果配置了Tomcat,以外置Tomcat启动Spring Boot项目的话,那么这种办法可能一点用没有(经过我测试)。

如果项目的启动时间不是很长,那么还可以忍受,但是你能忍受十几秒或者更长的时间吗,可能已经开始口吐芬芳了,那么在这种情况下,有没有办法来解决下这个,当时是有的了,我们可以以debug方式启动项目,然后修改代码后手动点击Hot swap classes,也可以做到不重启项目,更新class,但是不好处就在于是以debug方式启动。

那我们在换一种办法吧,毕竟条条大路通罗马,经过不断的研究,最后我决定了一个方案,也就是改Tomcat源码......好吧,可能还有一些IDEA插件,不过我没有去尝试,因为传说是收费的,所以最后花了些时间,改动了一下Tomcat源码,让他从根本上支持此功能。

注意这里就不是热加载问题了,我们也暂不讨论,Tomcat支持的热加载是不需要重启Tomcat,但是需要重启项目来对class更新,开发阶段修改代码后重启是非常麻烦的,所以,我们讨论「热替换」,也就是不重启项目的情况下,对修改的代码,让其在1秒内生效,怎么样,听起来是不是很激动?

没错,至少我是的,但是如果你启动Spring Boot项目的方式是从main方法,那我就没办法了,只要你肯在IDEA配置一个Tomcat,让其跑在这个Tomcat里,那么一切都好说,如下图。

7159e661c0c6034bf90f371bad9dbbab.png

这种启动的原理是IDEA会在/user/.IntelliJIdea2019.3/system/tomcat下创建一个Unnamed_项目名的文件夹,里面会有一些Tomcat相关的配置文件,如下图:

ded54faead2b1233df6c952380891cf6.png

他还会生成一个jmx的账号和密码,但是每次启动都会重新生成,可以使用jconsole工具进行连接调试,conf下面就是Tomcat启动时需要的文件,在conf/Catalina/localhost目录下会有一个xml文件,里面通过Context标记配置了项目信息,他的docBase属性指向了class路径。

如果你熟悉Tomcat,那么这些配置应该都很熟悉,接下来IDEA要做的就是修改catalina.base路径,让其指向这个文件夹即可,这样Tomcat原本webapps下的应用就会失效,conf下配置的信息也会失效。

细心的你应该会发现,Tomcat启动的时候就会打印出这些信息。

10-Jan-2021 14:04:28.452 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本:     Apache Tomcat/9.0.33
10-Jan-2021 14:04:28.456 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建:            Mar 11 2020 09:31:38 UTC
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号(:9.0.33.0
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本:               4.15.0-30deepin-generic
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构:                  amd64
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量:         /home/HouXinLin/apps/java/jdk/jdk1.8.0_241/jre
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM 版本:              1.8.0_241-b07
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商:            Oracle Corporation
10-Jan-2021 14:04:28.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /home/hxl/.IntelliJIdea2019.3/system/tomcat/Unnamed_auto-signin
10-Jan-2021 14:04:28.458 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /home/HouXinLin/apps/tomcat/tomcat2/apache-tomcat-9.0.33
10-Jan-2021 14:04:28.460 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/home/hxl/.IntelliJIdea2019.3/system/tomcat/Unnamed_auto-signin/conf/logging.properties
10-Jan-2021 14:04:28.460 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

他的原理简单的介绍了一下,下面该我们的Tomcat上场了,先放个视频。

35573916fc67f17954a6375774b4a141.gif

可以看到,1秒内完成了实时更新,但是目前只能做到修改方法体后生效,如果增加或者删除了方法,那么将无法更新,只能重启。

好处就是快,很快,非常快,非常非常快,session也不会丢失,什么都不会丢失!

原理解密

幸好在以前研究过Tomcat源码,不然可能都无法实现,要想要了解原理,就得需要掌握Tomcat项目的启动流程,以及最重要的Web应用类加载器,这是关键,Tomcat会为每个应用生成独立的类加载器,叫做ParallelWebappClassLoader,他是在StandardContext的启动方法中被实例化的,每个StandardContext就代表一个项目应用。

接下来就是就是最最最最主角,Java Agent,在JDK5的时候引入了一个NB的包叫java.lang.Instrument,他可以在运行的时候动态修改系统的class。

关于他的技术,留在下章中好好总结,下面是如何使用。

使用

下载Tomcat

我是基于Tomcat9来构建的,由于需要jdk/lib下的tools.jar,所以打包后体积会加上tools.jar的大小(17M),使用的方式和原版Tomcat无任何区别。最低的JDK版本应该需要8。

这个Tomcat不建议线上运行,适合开发调试阶段,线上的话需要使用官方的版本。

链接:https://houxinlin.com/apache-tomcat-9.zip

cccbf28eaa1c8be3b39e866c17c56123.png

接着回到IDEA中,依次点击配置Tomcat,然后选择Tomcat,一定要选我的这个。剩下的步骤就不说了,网上一大把。

9bf4bdd31c8be8b168f988d793945ea1.png

启动后会有如下日志打印。

10-Jan-2021 14:21:00.731 信息 [Attach Listener] com.hxl.Agent.agentmain Tomcat 热替换启动
10-Jan-2021 14:21:00.754 信息 [Attach Listener] com.hxl.AsmRedefine.initClassLoader 类加载器初始化完成,共发现[1]个
10-Jan-2021 14:21:00.755 信息 [Attach Listener] com.hxl.AsmRedefine.addItem 映射[/ROOT] To [/home/HouXinLin/projects/java/Idea/Java-Project/auto-signin/target/classes]

如果有什么问题,可以留言评价区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包里替换class文件_为了让Tomcat支持热替换,我直接修改了他的源码 的相关文章

  • Spring中使用RedisTemplate操作Redis(spring-data-redis)

    https www cnblogs com songanwei p 9274348 html RedisTemplate如何检查一个key是否存在 return getRedisTemplate hasKey key 由一个问题 复习了一下
  • JAVA中的Runtime启动子进程并杀掉

    一 前言 最近在项目中需要将一个java工程打成一个jar包 并在运行jar包后启动通过java中的runtime类来启动一个nodejs的服务 在做的过程中遇到了一些不小的坑 下面就将其记录下来 二 Runtime类 Runtime cl
  • MySQL基础篇【第一篇】 数据库概述及数据准备、常用命令、查看表结构步骤

    作者简介 大家好我是 每天都要敲代码 一位材料转码农的选手 希望一起努力 一起进步 个人主页 每天都要敲代码的个人主页 系列专栏 MySQL专栏 推荐一款模拟面试 刷题神器 从基础到大厂面试题 点击跳转刷题网站进行注册学习 目录 一 数据库
  • Java课题笔记~ SpringBoot基础配置

    二 基础配置 1 配置文件格式 问题导入 框架常见的配置文件有哪几种形式 1 1 修改服务器端口 http localhost 8080 books 1 gt gt gt http localhost books 1 SpringBoot提
  • ELM:ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比—Jason niu

    ELM ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比 Jason niu load spectra data mat temp randperm size NIR 1 P train NIR temp 1 50 T train o
  • IDEA插件-CheckStyle的安装与使用

    目录 一 安装CheckStyle 二 配置CheckStyle 三 使用CheckStyle 一 安装CheckStyle 1 依次访问IDEA gt gt File gt gt Settings gt gt Plugins gt gt
  • 轻松在Firefox中禁用JavaScript

    Want a quick and easy way to toggle JavaScript on and off in Firefox Then you will definitely want to take a good look a
  • 【Linux中高级运维:云计算】第1章:云计算简介+kvm虚拟机安装+日常操作和管理+快照管理

    1 什么是云计算 云计算是一种按量付费的模式 云计算的底层是通过虚拟化技术来实现的 2 云计算的服务类型 2 1IAAS 基础设施即服务 虚拟机 ecs openstack 2 2PAAS 平台即服务 php java docker容器 2
  • 浏览器主页被篡改360篡改浏览器主页,官方四步最完美解决办法

    以前写过一篇浏览器主页被360篡改成他们的主页的文章 那时真的就是气的直接卸载了360 之后通过修改注册表的方式 将主页修改回来 方法很暴力 由于重做了系统 360又被重新安装了回来 结果和以往一样 我的主页还是被强制修改了 但是这次我冷静
  • 3.1-并发控制:互斥

    复习 状态机 状态机 状态机 本次课回答的问题 Q 如何在多处理器上实现线程互斥 本次课主要内容 自旋锁的实现 互斥锁的实现 一 共享内存上的互斥 在共享内存上实现互斥 失败的尝试 mutex bad py 部分 成功的尝试 peterso
  • 3dmax 保存慢 卡死

    解决3DMAX保存慢的方法 方法一 在MAX环境中 按F11会弹出一个编辑框 然后输入 t trackviewnodes n t Max MotionClip Manager deleteTrackViewController t n co
  • 基于tensorflow2.0+使用bert获取中文词、句向量并进行相似度分析

    本文基于transformers库 调用bert模型 对中文 英文的稠密向量进行探究 开始之前还是要说下废话 主要是想吐槽下 为啥写这个东西呢 因为我找了很多文章要么不是不清晰 要么就是基于pytorch 所以特地写了这篇基于tensorf
  • 请求后端返回的验证码显示的情况

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 情况一 数据是图片文件流 二 情况二 直接返回是图片 情况三 uni小程序的登录验证 最后 前言 在实际的项目中验证码登录几乎是每个开发人员的必备操作技能
  • [工具环境] pip&git lfs下载命令

    关键词 pip git lfs pip从git下载指定的提交版本 伴随着大模型的火热发展 PEFT和transformers也是更新频繁 常会看到requirements中安装的软件包来自github中的某个commit hash 比如re
  • 应用编排与管理:核心原理

    本节课程要点 K8s 资源的重要元信息 使用阿里云服务演示一下如何去修改或查看 K8s 重要元数据 详细分析控制器模式 总结控制器模式特点 资源元信息 1 Kubernetes 资源对象 首先 我们来回顾一下 Kubernetes 的资源对
  • g2o的基本使用

    参考 https www jianshu com p e16ffb5b265d 参考 https zhuanlan zhihu com p 36889150 图是一种数据结构 在图优化中 用顶点 vertex 表示优化变量 用边 edge
  • Smali--Dalvik虚拟机指令语言-->【android_smali语法学习一】

    最近一周在研究rom移植 所以就对Smali语言学习了一下 Smali语言其实就是Davlik的寄存器语言 Smali语言就是android的应用程序 apk通过apktool反编译出来的都有一个smali文件夹 里面都是以 smali结尾
  • 基于当前系统制作docker镜像

    1 通过tar 备份目录 tar cvpf home buildrpm tar directory exclude proc exclude sys exclude dev exclude run root localhost home l
  • 不能安装64位office提示已安装32位的

    问题描述 安装64位office办公软件的时候提示已经安装32位的office办公软件所以无法继续安装 但实际上之前安装的32位的office办公软件已经卸载了 问题现象截图如下 解决办法 从问题描述中 我们其实已经能够看出问题原因了 类似

随机推荐

  • React的超详细讲解

    React React的重点 webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包器 module bundler 当 webpack 处理应用程序时 它会递归地构建一个依赖关系图 dependency
  • 虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)

    UPCGBlueprintElement是PCGGraph中自定义节点的基类 但官方目前还没有给出详细的文档 所以从源代码里找点答案 文章目录 可覆盖函数 Override Functions Excute 和 Excute with Co
  • web.xml加载顺序

    web xml加载顺序 应用服务器启动时web xml加载过程 至于这些节点在xml文件中的前后顺序没有关系 不过有些应用服务器 我曾碰到过的 websphere就严格要求web xml的节点顺序 否则部署不成功 所以还是赞成按照web x
  • CSS 样式穿透

    1 穿透语法 如果给样式中声明scop 那么页面的类会增加data 562e3wue8等属性 此时就需要用到 gt gt gt 或者 deep 或者 v deep 以后用后两个比较多 如果在样式类前面 v deep 则会自动找到 data
  • 快速搭建一个自己的服务器详解(java环境)

    一 服务器的购买 1 我选择的是阿里云的服务器 学生价9 5元一个月 百度直接搜索阿里云 然后点击右上角登录 推荐大家用支付宝扫码登录 方便快捷 阿里云官网的东西比较多 登录后我找了很久也没有找到学生服务器在哪里卖 最后在咨询里找到了这个网
  • 喜爱夜蒲3_百度百科

    喜爱夜蒲3 百度百科 喜爱夜蒲3
  • LeetCode707.设计链表

    题目描述 707 设计链表 力扣 LeetCode 这道题用单向链表和双向链表都能写 因为对双向链表不是很熟 所以就用双向链表来写了 由于初始化的链表并没有放入任何元素 所以这个结点就当成哑结点来处理 而且这样对之后的增删操作也更便利 C语
  • 通配符的使用

    通配符是一种特殊语句 主要有星号 和问号 用来模糊搜索文件 当查找文件夹时 可以使用它来代替一个或多个真正字符 当不知道真正字符或者懒得输入完整名字时 常常使用通配符代替一个或多个真正的字符 SQL 通配符 在搜索数据库中的数据时 SQL
  • java最大线程数

    Xms 初始堆大小 如 Xms256m Xmx 最大堆大小 如 Xmx512m Xmn 新生代大小 通常为 Xmx 的 1 3 或 1 4 新生代 Eden 2 个 Survivor 空间 实际可用空间为 Eden 1 个 Survivor
  • 华为OD机试 - 经典屏保(Java)

    题目描述 DVD机在视频输出时 为了保护电视显像管 在待机状态会显示 屏保动画 如下图所示 DVD Logo在屏幕内来回运动 碰到边缘会反弹 请根据如下要求 实现屏保Logo坐标的计算算法 屏幕是一个800 600像素的矩形 规定屏幕的左上
  • PermissionError: [WinError 5] 拒绝访问。解决办法

    PermissionError WinError 5 拒绝访问 问题描述 解决办法 一 找到programdata下anaconda3的python 二 进入Users的权限 将除了特殊权限外 全部挂上 三 在返回到anaconda3的目录
  • Nginx-简介

    用Python语言开发的站点使用的Web服务器主要有Nginx Apache以及淘宝的Tengine Nginx是由Igor Sysoev在2004年发布的一个开源 高性能的HTTP服务器和反向代理 它还可以用来作为IMAP POP3的代理
  • K8s基础6——应用配置管理方案、调度策略、污点和污点容忍

    文章目录 一 应用配置管理方案 1 1 ConfigMap 1 1 1 注入变量 1 1 2 挂载数据卷 1 2 Secret 1 2 1 数据卷挂载 1 2 2 变量注入 二 调度策略 2 1 nodeSelector定向调度 2 1 1
  • Github上 10 个开源免费且优秀的后台控制面板

    Web 开发中几乎的平台都需要一个后台管理 但是从零开发一套后台控制面板并不容易 幸运的是有很多开源免费的后台控制面板可以给开发者使用 那么有哪些优秀的开源免费的控制面板呢 我在 Github 上收集了一些优秀的后台控制面板 并总结得出 T
  • HTTP协议(下)

    前面我介绍了什么是HTTP协议 以及HTTP的协议格式 接下来我介绍一下如何使用代码构造出HTTP请求 以及在介绍一下HTTPS 目录 一 通过代码构造HTTP请求 1 基于HTML JS 1 1 基于form表单 1 2 基于ajax 2
  • vue + threejs 给3D模型添加label标签(dom的方式)

    webGL js封装的代码 const THREE window THREE webGL对象配置 export const webglOBJ renderDom null Scene null 场景 camera null 摄像头 rend
  • java OpenOffice把word转html(Convert word to html )

    1 下载安装OpenOffice 网址http download openoffice org index html 2 下载第三方工具包JODConverter http www artofsolving com opensource j
  • 天梯赛字符串替换题 “ 6翻了” Python 正则表达式替换

    输入格式 输入在一行中给出一句话 即一个非空字符串 由不超过 1000 个英文字母 数字和空格组成 以回车结束 输出格式 从左到右扫描输入的句子 如果句子中有超过 3 个连续的 6 则将这串连续的 6 替换成 9 但如果有超过 9 个连续的
  • selenium之 chromedriver与chrome版本映射表(更新至v2.46)

    更多关于python selenium的文章 请关注我的专栏 Python Selenium自动化测试详解 看到网上基本没有最新的chromedriver与chrome的对应关系表 便兴起整理了一份如下 希望对大家有用 chromedriv
  • 包里替换class文件_为了让Tomcat支持热替换,我直接修改了他的源码

    前言 又是一个周日 贫穷的我依然使用电源适配器来暖手 所以 这章来我们聊聊 热 这个问题 啊啊啊啊啊啊 不知道各位网友是怎么解决修改代码后 不重启 立即生效对的 如果在Spring Boot项目中 可能有部分人会加入spring boot