1. 概述

本地更新脚本是基于arthas工具的retransform命令热替换class,此方法用于在不重启项目的前提下,替换更新的class,如关键类添加打印日志,排查线上问题

但是arthas工具的命令稍显复杂,有那个时间还不如重新部署,因此需要一个可以快速替换的工具来进行替换

2. 方法一:ArthasHotSwap插件

使用idea插件 ArthasHotSwap插件,安装后,选中类名数据右键点击“swap this class”,会复制一个脚本,然后粘贴到项目启动的服务器上,可完成替换,具体网上均有教程,此处不多赘述。

3. 方法二:自定义shell脚本

我本人也使用过这个插件,但是试过几次均没有成功因此模仿ArthasHotSwap插件的流程,写了一个自定义脚本。

3.1. ArthasHotSwap 插件流程

大致流程如下:

1.将本地需替换的class文件,编码成base64文本文件,并上传至文件服务器(可能是OSS)2.提供一个默认执行脚本,给用户复制3.用户拿到复制脚本后,在服务器上执行4.脚本下载base64文本文件,并解析成class文件5.启动arthas命令,如果用户没有安装,脚本会自动安装,默认路径 /home/用户名xxx/.arthas/6.执行arthas中的retransform 命令,将解析出来的class文件替换至运行的jvm中 

3.2. 自定义脚本

按照这个流程,自定义写了一个脚本,去掉了上传文件服务器步骤,只需要把许替换的文件上传至服务器指定目录,启动脚本时指定项目包名称,即可完成指定项目多个class文件热替换

#热刷新class指定路径配置updateClassPath="/tmp/replace"#服务器上arthas路径arthasPath="/home/cmp/.arthas/lib/3.6.7/arthas"#入参 项目包名称,支持模糊匹配projectName=$1rm -f tmp_inmknod tmp_in pexec 8 tmp_insh ${arthasPath}/as.sh --select $projectName > tmp_insleep 3secho "开热加载......"#遍历目录中的所有class文件for file in ${updateClassPath}/*do    echo ${file}    #如果file后缀是class 执行替换    if [ "${file##*.}" = "class" ]; then        #开始启动arthas项目        echo "热加载${file}"        echo "retransform ${file}" >> tmp_in    fidoneecho "quit" >> tmp_in