使用Arthas热更新类(热部署不需要重启服务)

背景

现场出现静态变量定义错误的情况,因为生产问题又不能重新发包。所以需要热部署更新类。

此处为转载

以某个界面为例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20krDnPn-1602947350743)(en-resource://database/1135:1)]

找到程序Action层或者Controller层
类的全路径:
com.ailk.openbilling.ams.action.freeResourceQuery.FreeResourceQueryActionImp
要观察的方法名:
queryFreeRes

1、热更新类

更新前:
在这里插入图片描述

(1)、将要反编译的文件 反编译到指定目录

命令:
jad com.ailk.openbilling.ams.action.freeResourceQuery.FreeResourceQueryActionImpl > /home/acctuser/cz/FreeResourceQueryActionImpl.java
结果:
在这里插入图片描述

在这里插入图片描述

(2)、修改文件内容

在这里插入图片描述

(3)、查找要更新的类的classLoader的哈希码

命令:

sc -d *FreeResourceQueryActionImpl | grep classLoaderHash

结果:
在这里插入图片描述

(4)、编译修改后的文件

命令:
mc -c 2b53eef4 /home/acctuser/cz/FreeResourceQueryActionImpl.java -d /home/acctuser/cz

结果:(编译报错)
在这里插入图片描述

问题解决
  • 查看日志:
    在这里插入图片描述

  • 查看编译后的源码(发现头部多了好多类加载信息之类的东西)
    在这里插入图片描述

  • 重新反编译源码并且加上 --source-only 表示只输出源码
    命令:
    jad --source-only com.ailk.openbilling.ams.action.freeResourceQuery.FreeResourceQueryActionImpl > /XXX/XXX/cz/FreeResourceQueryActionImpl.java

  • 结果:(反编译成功)
    在这里插入图片描述

  • 重新修改.java文件后再次编译

  • 又编译报错了
    在这里插入图片描述

  • 直接把本地修改好的.java文件放上去使用arthas编译成功生成了.class文件
    在这里插入图片描述

  • 继续热更新代码:
    命令:
    redefine /home/acctuser/cz/com/ailk/openbilling/ams/action/freeResourceQuery/FreeResourceQueryActionImpl.class

  • 结果失败:(提示增加或者删除了类或方法)
    在这里插入图片描述

  • 查看编译后的代码发现多了一个static{}和Log;

  • 重新将反编译后的.java文件放到本地eclipse中将里面未指定泛型的报错(反编译会擦除泛型)地方修改掉,放到服务器重新使用mc -c 命令编译然后再热更新
    热更新成功:
    在这里插入图片描述

更新后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一波三折终于热更新成功…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值