前情概要
有一个 springboot 的 jar 包,在没有源码的前提下,如何对其中的代码进行修改呢?比如说该 jar 包中有一些校验加密等的逻辑,需要去掉这段代码。
思路分析
- 将 jar 包解压,找到相应的代码 class 文件
- 将 class 文件反编译后,对源码进行修改
- 将修改后的源码重新编译为 class 文件
- 将解压包中的 class 文件替换
- 将解压包重新打为 springboot jar 包
详细步骤
解压 jar 包
jar -xf xxx.jar
输入如上命令以后,即可解压 jar 包,解压后的目录如下:
- BOOF-INF:存放项目本身的 class 文件和 lib 外部 jar 包依赖
- META-INF: JAR 文件的标准目录,用于存放元数据信息。例如启动的主清单信息,maven 信息等。核心文件为
MANIFEST. MF
- org:springboot 专属的启动 loader。对于 springboot 项目很重要。
反编译 class 文件
利用 idea,jadx 等反编译工具,将 class 文件反编译。然后将代码拷贝出来,进行对应的修改。这步根据实际需求修改。
重新编译源码
将上述改完的 java 文件,例如 Test.java
重新编译为 class 文件。这步需要注意,如果该文件有依赖外部的一些包,需要在编译时指定外部依赖。这里可以指定整个原项目的 lib 目录为依赖,命令如下:
javac -cp "./BOOT-INF/lib/*:." Test.java
生成 class 文件 Test.class
替换原 class
这步没啥好说的,直接将新生成的 class 文件复制粘贴覆盖原来即可
重新打包为 jar
这一步需要将解压后的所有文件重新打包成可执行的 jar 包。
注意事项如下:
默认的 jar cvfm
命令会压缩 jar 包,而Spring Boot要求所有嵌套JAR文件都必须以存储模式(而不是压缩模式)存储。需要确保在重新打包时,所有嵌套JAR文件都没有被压缩。
命令如下:
jar -cfm0 xxx.jar META-INF/MANIFEST.MF .
总结
按上述步骤,就可以替换 jar 包中的指定 class 文件了。