jar包文件修改(java编译与反编译)

日常的java项目中99.99%的可能,会引入依赖jar包。而jar包来源多样,难免会有一些BUG。因此对jar包中相关文件的修改就很有必要。修改的方式有好几种。以下方式经过了实践验证,绝对可行。

===================================插播===================================

在进行正题之前,插播一个关于maven打包的问题:

maven打包有spring-boot-maven-plugin和"原生"maven两种。。。插件工具吧。

其中spring-boot-maven-plugin是创建spring boot项目时,默认带的一个;后者 "原生"maven 就是咱们自己安装的那个。

这两种本质上应该是并无区别,但是否相通(比如spring-boot-maven-plugin的原理是啥)我并没有探究,如有道友了解,可否say一下。

两种方式打出的jar包,能否正常运行,取决于打出的jar包是否完整(包不包含项目依赖jar等)。这是可以进行配置的,就是说打出的jar包是否完整,我们可以自己调控。

说一个我发现的情况:

1)jar包完整的时候(能够通过java -jar xxx.jar 命令启动)其他项目引入我们自己的jar后,里面的方法无法使用。插件配置(没有额外需求使用默认配置即可)和打出的jar包组织结构类似于下:

2)jar包不完整(不能使用java -jar xxx.jar 命令启动)的时候,其他项目引入我们自己的jar后,里面的方法可以正常使用。插件配置和打出的jar包组织结构类似于下:

具体原理,有懂得请评论区赐教。

=================================插播完===================================

修改jar包中代码的步骤:

1)找到jar包位置,使用一下命令查看jar包中要修改文件的位置:

复制代码
jar tf xxx.jar

找到要修改的文件为:com/hwj/demoboot/utils/TestJar.class

2)使用以下命令单独提取该文件:

复制代码
jar xf xxx.jar xxx/xxx/xxx.class

此时,返回到jar包所在文件夹,我们可以发现该文件已被提取出来

3)使用jd-gui反编译工具,将class文件反编译为java文件

jd-gui下载地址:Java Decompiler

使用jd-gui打开class文件后,再选择保存文件:

我们可以发现,保存的时候,class文件已经被反编译为java文件:

4)打开并修改java文件

修改方法名为isOkEdit,并保存修改内容

5)编译前准备

这里需要注意,因为我们这个文件中引入了spring框架中的StringUtils方法,所以我们编译的时候,也要加上这个相关的依赖。就是说文件中要是引入了第三方的类,那编译的时候要全部加上。

为了方便编译,我把相关的依赖放到和java文件一样的位置:

6)编译java文件

到java文件所在位置,执行以下命令:

复制代码
javac -cp 依赖xxx.jar; xxx.java

如果有多个依赖,使用;号隔开。注意,最后的java文件,和前面要有空格隔开,否则会报找不到源文件异常。

编译完成后如下:

7)替换原来的class文件

将编译生成的新文件拷贝到对应位置:

8)使用以下命令,将class文件再打入原来的jar包(注意后面class文件的相对路径)

复制代码
jar uf xxx.jar xxx/xxx/xxx.class

9)查看jar包中结构:

可见,jar包中方法已被成功修改,也可被成功使用。

相关推荐
devilnumber10 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
独泪了无痕10 小时前
MyBatis魔法堂:结果集映射
后端·mybatis
copyer_xyf11 小时前
LangChain 调用 LLM
后端·python·agent
copyer_xyf11 小时前
Prompt 组织管理
后端·python·agent
asdfg125896311 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy110112 小时前
JavaScript变量
开发语言·javascript·ecmascript
z落落12 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway213 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash
weixin_4624462313 小时前
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名
开发语言·tcp/ip·bash
一个梦醒了13 小时前
安装git bash选项推荐
开发语言·git·bash