由于源码缺失的原因, 需要针对性的对 class 进行修改, 然后编译替换
方法
-
下载生产环境的 jar 包, 确定 jdk 版本
-
解压 jar 包, 得到工程文件(字节码)
-
如果是 springboot 的 jar, 那么在 lib 中, 得到依赖的 jar
-
把工程文件和依赖的 jar, 都放在 idea 的工程下(新建一个空的工程)
1
2
3
4
-| 根目录
-| com.xxx (字节码工程)
-| lib (依赖的 jar)
-| cp.ck (classpath 描述文件)
-
cp.ck 的内容, 就是 lib/annotations-3.0.1.jar:lib/annotations-13.0.jar ….. 把所有的依赖的 jar 都加进去
-
使用 jar -cvf com.jar com 来把字节码工程打成 jar 包, 并放到 lib 下, 因为单独编译, 需要修改的这个 java 文件需要工程里其他的 class 文件
-
在字节码工程文件夹内找到你想修改的 class 例如:com/gomyck/server/service/FileUploadService.class
-
新建一个 java 类, 名字一样 例如:com/gomyck/server/service/FileUploadService.java
-
把反编译的代码 copy 进去, 然后修改逻辑
有时候 IDEA 反编译的时候, 异常处理的代码反编译会出现变量命名重复的问题, 需要人工处理一下这种问题, 否则 javac 的时候会报重复命名的错误!
1
2
3
4
} catch (Exception var42) {
Exception var42 = var42;
log.error("get image error,", var42);
}
- 修改好之后, 在根目录, 执行下面的命令, 即可完成编译
1
$ javac -cp "$(cat cp.ck)" -g -parameters com/zebra/server/service/FileUploadService.java
- 编译好的 class 文件会替换原有的 class, 把 class 文件替换会最初解压的 jar 文件中, 使用打包命令打包 jar
1
2
3
4
# 打包
$ jar -cvf xxx.jar .
# 解包
$ jar -xvf xxx.jar