在实际项目中,打包之后发现代码错误,要么重新打包,要么替换掉jar包中的class文件,但是这两种方法都需要停掉服务器,可能会造成一定的损失,
下面介绍利用arthas来热更新jar包中的文件
首先我们写一个测试接口,
@RestController
@RequestMapping("/test")
public class testMain {
@GetMapping("replace")
public void test(){
System.out.println("===========================================");
System.out.println("=============replace befor ============");
System.out.println("===========================================");
}
}
并且打包发布,通过url访问测试结果
一切正常
现在修改test方法中的内容
public class testMain {
@GetMapping("replace")
public void test(){
System.out.println("===========================================");
System.out.println("=============replace after ============");
System.out.println("===========================================");
}
}
重新编译之后,得到class文件
我们下载arthas文件,下载地址https://alibaba.github.io/arthas/install-detail.html#
执行arthas-boot.jar可执行文件,运行起来,我们会得到正在运行的java进程
(建议在jdk安装目录下启动)
选择需要更新jar包的对应pid
执行命令
sc -d 类名 grep classLoaderHash
得到classLoaderHash为20ad9418
执行命令
redefine -c 20ad9418 待替换的class路径
这样,我们再去测试刚才的接口
我们得到替换之后的class文件
这样,我们在不停服务器的情况下,更新了服务器的代码