前提
很多时候本地调试没啥问题,发到线上就出现问题,本地修改了代码要发布到线上比较费时。
那有没有什么方式直接更新上线代码? 有了Arthas,一切皆有可能。
安装Arthas就不在这里赘述了,官方链接写的很清楚也很简单官方地址
上代码
# 反编译代码 把 下面的xxxxx 换成你自己的类, ">" 后面是你指定的路径
jad --source-only com.xxx.xxxx.Abc.java > /tmp/Abc.java
# 获取xxxx的ClassLoader的Hash值
sc -d com.xxx.xxxx.Abc.java | grep classLoaderHash
# 将上面得到的Hash值 换了“3d818f88” 这个
mc -c 3d818f88 /tmp/Abc.java -d /tmp
# 更新代码 xxx 对应你包的路径
redefine /tmp/xxx/xxx/xxx/Abc.class
切记,redefine后不要用jad查看是否成功。
官方解释:redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置
后记
上面的代码我也记不住,主要用了Idea 的Arthas的插件,需要的自行下载吧

当本地代码调试无误但线上出现问题时,Arthas提供了一种便捷的在线代码更新方法。通过jad反编译、sc命令获取ClassLoader Hash、mc命令替换代码及redefine命令更新代码,可以避免繁琐的发布流程。不过要注意,redefine后不应立即使用jad检查,因为两者可能存在冲突。使用Idea的Arthas插件可简化操作。
3782

被折叠的 条评论
为什么被折叠?



