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