使用 javac 单独编译一个 java 文件

JAVAC JAVA COMPILER

Posted by gomyck on July 24, 2024

由于源码缺失的原因, 需要针对性的对 class 进行修改, 然后编译替换

方法

  1. 下载生产环境的 jar 包, 确定 jdk 版本

  2. 解压 jar 包, 得到工程文件(字节码)

  3. 如果是 springboot 的 jar, 那么在 lib 中, 得到依赖的 jar

  4. 把工程文件和依赖的 jar, 都放在 idea 的工程下(新建一个空的工程)

1
2
3
4
-| 根目录
  -| com.xxx (字节码工程)
  -| lib (依赖的 jar)
  -| cp.ck (classpath 描述文件)
  1. cp.ck 的内容, 就是 lib/annotations-3.0.1.jar:lib/annotations-13.0.jar ….. 把所有的依赖的 jar 都加进去

  2. 使用 jar -cvf com.jar com 来把字节码工程打成 jar 包, 并放到 lib 下, 因为单独编译, 需要修改的这个 java 文件需要工程里其他的 class 文件

  3. 字节码工程文件夹内找到你想修改的 class 例如:com/gomyck/server/service/FileUploadService.class

  4. 新建一个 java 类, 名字一样 例如:com/gomyck/server/service/FileUploadService.java

  5. 把反编译的代码 copy 进去, 然后修改逻辑

有时候 IDEA 反编译的时候, 异常处理的代码反编译会出现变量命名重复的问题, 需要人工处理一下这种问题, 否则 javac 的时候会报重复命名的错误!

1
2
3
4
} catch (Exception var42) {
    Exception var42 = var42;
    log.error("get image error,", var42);
}
  1. 修改好之后, 在根目录, 执行下面的命令, 即可完成编译
1
$ javac -cp "$(cat cp.ck)" -g -parameters com/zebra/server/service/FileUploadService.java
  1. 编译好的 class 文件会替换原有的 class, 把 class 文件替换会最初解压的 jar 文件中, 使用打包命令打包 jar
1
2
3
4
# 打包
$ jar -cvf xxx.jar .
# 解包
$ jar -xvf xxx.jar