2023-2更文29-通过arthas进行线上java代码热更新

1,539 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情

通过arthas进行线上java代码热更新

前文

本文内容主要是关于通过arthas进行线上代码热更新的操作总结。

如何通过arthas进行线上代码热更新

首先,需要在需要修改的环境中进行java环境的安装,以及arthas运行包的上传,运行包可以从官网中进行获取:arthas.aliyun.com/arthas-boot…

arthas安装后,首先我们要保证需要热更新的项目已启动,此时进行arthas程序的启动,java -jar arthas-boot.jar,启动后我们可以查看到当前系统中已经启动的全部java服务:

image.png

而当我们需要对哪个项目进行代码的热更新时,直接在交互框中输入对应的数字即可,例如本文选择服务1进行更新,则直接在交互框中输入数字1。

下一步,我们需要查找到需要进行热更的文件,利用sc命令获取相关信息,例如: sc -d business.rest.SysMenuController。同时,根据执行的结果,我们需要获取classLoaderHash这个哈希值,进行记录。

下一步则是进行代码的修改,也就是首先对代码进行反编译和存储,使用如下命令: jad business.rest.SysMenuController > /tmp/SysMenuController.java。此时,我们已经将对应的反编译结果存储到对应的文件中。要注意的是,反编译的结果开头及结尾有一些冗余信息,需要我们进行手动删除,同时需要进行我们所需要修改内容的变更。文件内容的变更需要在linux环境下直接执行,arthas环境下无法进行文件的修改。

文件变更后,我们需要再将文件重新进行编译,此时需要切换回arthas环境之中。执行命令mc -c /tmp/SysMenuController -d /tmp即可重新完成文件的编译,获得编译后的字节码文件,也被存储在tmp文件夹中。

编译后就到了最后一步,进行编译结果在内存中的覆盖。同样是需要在arthas环境中执行命令,redefine /tmp/business/rest/SysMenuController.class,将编译后的文件重新写入到内存中。经过上述的操作,也就实现了代码的热更,可以发现程序已经生效。

总结

本文主要是关于利用arthas进行代码热更方式的总结,以此来实现不打包直接进行数据更新。