由于源码缺失的原因, 需要针对性的对 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