前提
很多时候本地调试没啥问题,发到线上就出现问题,本地修改了代码要发布到线上比较费时。
那有没有什么方式直接更新上线代码? 有了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的插件,需要的自行下载吧