项目中最近引入了三方jar,此jar有逻辑bug,无源码,需增加非空判断,更新其中一个class类
第一步:使用反编译工具JD-GUI打开jar包
找到要修改的类
FIle->save(保存class的java文件)
最早一开始我没有使用JD-GUI工具,我是在idea里直接反编译看到的源码,ctrl+a复制,ctrl+v粘贴到新建的xx.java文件中来完成源码保存的,但此源码在javac编译的时候会遇到类型转换异常、找不到符号之类的错误,最后还是乖乖用JD-GUI工具来反编译保存源码
第二步:将java源码文件拖进idea
简单编辑,修改逻辑,保存文件
此处有一个坑点:JD-GUI工具反编译的源码,在遇到有双重foreach的时候丢失了第二个foreach的逻辑,好在javac的时候有符号错误的报错,我再复制了一下idea中反编译的细节更多的源码,把逻辑补全了,最后顺利编译成功。
提醒大家最好还是把idea反编译的内容与gui反编译的内容做一下比对,以免内容丢失。
第三步:执行javac编译
若需编译的java文件有import相关类,则javac编译的时候需指定相关jar路径
比如文件中引入了如下类
则需要新建lib文件夹,将相关依赖放进lib里
最后执行
javac -Djava.ext.dirs=D:\xxx\lib Schedule.java
# -Djava.ext.dirs=D:\xxx\lib 为待编译java文件的所有依赖jar
# Schedule.java为待编译的源码文件,绝对路径/相对路径均可
如果依赖的jar不多,也可以执行
javac -cp D:\xxx\lib\xx.jar Schedule.java
# 多个jar之间通过;分隔
第四步:更新class文件到jar包里
方案一:windows下简单粗暴:通过winrar打开jar,手动将class文件拖进对应目录位置,替换更新即可。(我用的这种)
方案二:使用命令: jar -uvf xx.jar Schedule.class