仅修改某个类的实现逻辑或修复bug而不重新编译构建整个项目时,可以使用命令行工具手动替换class文件。
只看命令,想看命令解释往下翻
单一class文件
1 |
|
文本文件
直接 vim com.zhiyin.mes.app.dengqi.produce-1.0.0-SNAPSHOT.jar
命令解释一:替换JAR包中的单个class文件
第一步:查看目标class文件在JAR包中的路径
1 | jar tvf com.zhiyin.mes.app.dengqi.produce-1.0.0-SNAPSHOT.jar | grep APSMesOrderPushService.class |
解释:
jar:JDK提供的工具命令,用于创建、查看和更新JAR包。
t:list(列出)JAR包的内容。
v:verbose(详细显示),输出每个文件的大小、时间等信息。
f:file,表示指定一个jar包文件。
grep APSMesOrderPushService.class:筛选包含指定class名称的条目。
👉 目的是定位要替换的类文件在JAR包中的路径。
第二步:解压目标class文件
1 | jar -xvf com.zhiyin.mes.app.dengqi.produce-1.0.0-SNAPSHOT.jar BOOT-INF/classes/com/zhiyin/service/thirdpush/APSMesOrderPushService.class |
解释:
x:extract,解压文件。
v:verbose,显示详细过程。
f:指定要解压的JAR包文件名。
BOOT-INF/…/APSMesOrderPushService.class:精确解压这个class文件,不解压其他内容。
👉 可以用这个命令查看并对比class路径,确认替换位置无误。
第三步:将新编译的class文件拷贝替换旧文件
1 | cp APSMesOrderPushService.class BOOT-INF/classes/com/zhiyin/service/thirdpush/APSMesOrderPushService.class |
解释:
cp:Linux/Unix中的拷贝命令。
第一个参数是本地编译出的新class文件。
第二个参数是之前解压出来的原文件位置(JAR内部的路径结构)。
👉 这一步完成实际的class文件替换(覆盖原有文件)。
第四步:将新的class文件重新打入JAR包中
1 | jar -uvf com.zhiyin.mes.app.dengqi.produce-1.0.0-SNAPSHOT.jar BOOT-INF/classes/com/zhiyin/service/thirdpush/APSMesOrderPushService.class |
解释:
u:update,更新JAR包内容。
v:显示详细信息。
f:指定JAR文件。
BOOT-INF/…:表示要打包进JAR的新文件路径,必须和原来保持一致!
👉 这一命令将替换掉JAR包中原来的class文件,完成热修复操作。
📄 命令解释二:修改JAR包中的文本文件
直接用vim打开并编辑:
1 | vim com.zhiyin.mes.app.dengqi.produce-1.0.0-SNAPSHOT.jar |
说明:
虽然JAR包本质是ZIP压缩格式,但如果想直接修改其中的文本文件(如配置文件 .properties、.xml、.json 等),可以用vim打开。
⚠️ 需要注意:
不适合修改二进制class文件,容易破坏结构。
编辑后保存的JAR包仍然是有效压缩包。
仅仅用来修改配置文件。