如何修改 JAR 包中的源码
如何修改 JAR 包中的源码
- 前言
- 一、准备工作
- 二、将 JAR 当作 ZIP 打开并提取
- 三、重写 Java 类
- 方法 A:直接替换已编译的 `.class`
- 方法 B:运行时类路径优先加载
- 四、修改 MyBatis(或其他)XML 资源
- 五、重新打包 JAR(命令行)
- 六、验证改造
前言
在无法通过源码级插件或扩展机制实现深度定制时,可以直接对第三方 JAR 进行改造。本指南涵盖两大部分:
-
重写 Java 类
-
方法 A:直接替换
.class
-
方法 B:利用运行时类路径优先级加载自定义实现
-
-
修改资源文件(如 MyBatis XML)
-
重新打包 JAR
通过这三步,即可拥有一个包含自定义 Java 行为和调整过映射文件的完整 JAR。
一、准备工作
-
工具
-
JDK(含
javac
、jar
) -
ZIP 工具:7-Zip、WinRAR 或命令行
unzip
/zip
-
-
项目结构
-
本地工作目录
workspace/
-
原始 JAR:
workspace/lib/original.jar
-
输出目录:
workspace/out/
-
二、将 JAR 当作 ZIP 打开并提取
-
打开归档
- 在文件管理器右键
original.jar
→ 7-Zip → Open Archive
- 在文件管理器右键
-
浏览与提取
-
定位到:
com/example/service/MyService.class org/mybatis/mapping/EntityMapper.xml
-
将它们分别“Extract”到
workspace/src_classes/
与workspace/src_resources/
-
此步仅用于获取原始文件样本与路径,后续改造可完全在本地完成。
三、重写 Java 类
方法 A:直接替换已编译的 .class
-
在本地创建相同包路径
workspace/project/src/main/java/com/example/service/
-
编写或粘贴重写后的源码
// MyService.java package com.example.service;public class MyService {@Overridepublic String process(String input) {// 自定义逻辑return "[Custom] " + input.toUpperCase();} }
-
编译生成
.class
javac -d workspace/out/classes \workspace/project/src/main/java/com/example/service/MyService.java
-
用 7-Zip 覆盖原 JAR 中的 class
-
打开 original.jar,拖入
workspace/out/classes/com/example/service/MyService.class
-
确认替换
-
-
关闭归档,JAR 已含自定义 Java 实现
原理:当 JVM 加载类时,直接从 JAR 内相对路径读取
.class
,已覆盖文件会被优先使用。
方法 B:运行时类路径优先加载
-
直接将源码放入项目
- 与上面同样的包路径及文件:src/main/java/com/example/service/MyService.java
-
确保运行时 classpath 顺序
- 项目输出(含自定义类)需在第三方 JAR 之前
- 例如命令行启动:
java -cp target/classes:lib/original.jar com.example.Main
-
JVM 加载优先使用
target/classes
中的 class ,无需改动 JAR优点:无需修改 JAR,适用于开发迭代或测试时快速覆盖。
四、修改 MyBatis(或其他)XML 资源
MyBatis 映射文件通常以 .xml
形式嵌入 JAR,无法通过 Java 机制 Override,必须物理替换:
-
定位 XML
-
在 7-Zip 中,打开路径:
org/mybatis/mapping/EntityMapper.xml
-
-
提取并编辑
-
“Extract” 到
workspace/src_resources/org/mybatis/mapping/
-
用编辑器修改 SQL、命名空间等,例如:
<select id="findById" resultType="com.example.Entity">SELECT id, name, statusFROM CUSTOM_ENTITY_TABLEWHERE id = #{id} </select>
-
-
将修改后的 XML 覆盖回 JAR
- 拖回 7-Zip 窗口,确认替换
同理:任何
META-INF/
、application.properties
、Spring XML 等资源都可如此替换。
五、重新打包 JAR(命令行)
若偏好脚本化,无需 GUI,可用 JDK 自带 jar
工具重建:
-
准备输出目录
workspace/out/classes/ ← Java .class workspace/out/resources/ ← XML、配置文件
-
执行打包
cd workspace/out jar cf modified.jar \-C classes . \-C resources .
-
检查内容
jar tf modified.jar
确认 com/example/service/MyService.class
及 org/mybatis/mapping/EntityMapper.xml
均已更新。
六、验证改造
-
替换运行时库
- 将原
lib/original.jar
换成out/modified.jar
- 将原
-
启动应用并测试
-
调用被重写的方法,确认 Java 逻辑生效
-
执行涉及 MyBatis 的操作,验证新 SQL 或映射是否正确
-