如何修改 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 或映射是否正確
-