环境: 以下环境是在windows环境中,测试学习用,项目很简单,一个SpringBoot项目,定义了一个接口,返回字符串。
目标: 用arthas工具修改代码
官方文档: arthas文档
1、部署项目
类的全路径:com.demo.MyTestController
@GetMapping("/test")
public String test() {
String str1 = "这是字符串1";
String str2 = "这是字符串2";
String aa = str1;
return aa;
}
2、启动arthas-boot.jar
下载: curl -O https://arthas.aliyun.com/arthas-boot.jar
启动:java -jar arthas-boot.jar
3、通过Arthas修改并热发布代码
主要使用jad
、mc
、retransform
三个命令:
3.1 下载源代码
jad --source-only com.demo.MyTestController > /tmp/MyTestController.java
我本地的MyTestController.java
在d盘tmp目录下
3.2 修改源代码
d://tmp/MyTestController.java
记事本打开,修改为 aa = str2
3.3 重新编译源代码
mc /tmp/MyTestController.java -d /tmp/
我当时本地编译报错了:
Memory compiler error, exception message: Compilation Error
使用sc 命令查看classLoaderHash
sc -d com.demo.MyTestController
能看到:classLoaderHash: bebdb06
再次执行:
mc -c bebdb06 /tmp/MyTestController.java -d /tmp/
tmp下就生成了 com/demo/MyTestController.class
3.3 重载class文件
retransform /tmp/com/demo/MyTestController.class
访问test接口,返回内容变了,说明代码已经实时生效。