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 小时前
【c++面向对象编程】第49篇:面向对象的单元测试:用GoogleTest测试类
开发语言·c++·单元测试
lly2024068 小时前
Python3 条件控制
开发语言
biter down8 小时前
3:GUI⾃动化简单⽰例
开发语言
坚定学代码8 小时前
如何在c++中使用MySQL
开发语言·c++·mysql
小牛蛋8 小时前
vcpkg 管理 PCL + VTK + Qt 开发三维点云可视化软件
开发语言·qt
阿维的博客日记8 小时前
简单介绍一下CompletableFuture,从最简单的用法介绍,
java
zandy10118 小时前
2026 BI平台安全治理体系构建:从权限模型到零信任架构
java·开发语言
纽扣6678 小时前
【C++通关之路】C++ 继承深度全景指南:从语法陷阱到内存底层的终极复习
开发语言·c++
SuniaWang8 小时前
《Agentx专栏》02-技术选型:预算有限时如何做出正确的技术决策
java·spring·架构·langchain·milvus·agenx·opl