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包中方法已被成功修改,也可被成功使用。

相关推荐
萧瑟余晖8 分钟前
Java深入解析篇三十之Java日志框架
java·开发语言
Herbert_hwt22 分钟前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法
苏三说技术33 分钟前
为什么越来越多人用 Pi ? - 苏三说技术
后端
AI视觉网奇38 分钟前
动作识别 视频理解大模型
开发语言·python·音视频
YHL1 小时前
🚀 SSE 服务器发送事件与 BFF 层实战
前端·后端
星火10241 小时前
【LangChain4j系列05】RAG 检索增强生成完整指南
人工智能·后端
Suxing91 小时前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
减瓦1 小时前
别让 Java 版本选择变成生产事故
java
ikun_文1 小时前
Java集合框架Collection拓展进阶
java·java ee
技术长镜头1 小时前
别再只说“走 B+Tree”:一条 SQL 在 InnoDB 中的完整寻址过程
后端·mysql