修改JAR文件并重新打包的兩種方式
本文介紹兩種修改 JAR 包內(nèi)文件(如配置文件或 Class 文件)后重新打包的方式:Java 命令方式 與 Ant 腳本方式。
核心警告
對(duì)于 Spring Boot 的可執(zhí)行 JAR 包,重新打包時(shí)嚴(yán)禁使用壓縮(必須使用存儲(chǔ)模式),否則會(huì)導(dǎo)致 ClassNotFoundException 或啟動(dòng)失敗。
一、Java 命令方式 (通用/快速)
適用于臨時(shí)修改或沒(méi)有構(gòu)建工具的環(huán)境。
1. 解壓 JAR 文件
# -x: 解壓, -f: 指定文件, -v: 顯示過(guò)程(可選) jar -xf your-file.jar
2. 修改文件
在解壓后的目錄中,按需編輯文件(例如修改 BOOT-INF/classes/application.yml 或替換 .class 文件)。
3. 重新打包 (關(guān)鍵步驟)
# 注意:必須包含 -0 參數(shù)(存儲(chǔ)模式,不壓縮) jar -cvfm0 new-package.jar META-INF/MANIFEST.MF ./
參數(shù)詳解:
-c: 創(chuàng)建新的歸檔文件。-v: 生成詳細(xì)輸出。-f: 指定歸檔文件名。-m: 包含清單文件META-INF/MANIFEST.MF(保留 Main-Class 等配置)。-0: 存儲(chǔ)模式(不壓縮)。這對(duì)于 Spring Boot 的嵌套 JAR 結(jié)構(gòu)至關(guān)重要。
二、使用 Ant 腳本方式 (自動(dòng)化/批處理)
適用于需要頻繁修改或集成到舊版構(gòu)建流程中的場(chǎng)景。
1.build.xml配置示例
<?xml version="1.0" encoding="UTF-8"?>
<project default="package" name="JarPatcher">
<description>
Spring Boot JAR 包熱修復(fù)/修改工具
</description>
<!-- 1. 屬性定義 -->
<property name="class.dir" location="./unpacked_classes"
description="解壓后的臨時(shí)目錄"/>
<property name="newjar.name" location="fixed-app.jar"
description="生成的新 JAR 名稱"/>
<property name="sourcejar.name" location="original-app.jar"
description="原始 JAR 路徑"/>
<!-- 2. 初始化:清理并創(chuàng)建目錄 -->
<target name="init">
<delete dir="${class.dir}" />
<mkdir dir="${class.dir}" />
</target>
<!-- 3. 解壓:將原始 JAR 解壓 -->
<target name="unjar" depends="init">
<unjar dest="${class.dir}" src="${sourcejar.name}">
</unjar>
<echo message="JAR 解壓完成,請(qǐng)?jiān)诖瞬襟E后修改 ${class.dir} 中的文件。"/>
</target>
<!-- 4. 打包:重新打包 (注意 compress="false") -->
<target name="package" depends="unjar">
<jar destfile="${newjar.name}"
basedir="${class.dir}"
compress="false"
manifest="${class.dir}/META-INF/MANIFEST.MF">
</jar>
<echo message="新 JAR 生成成功: ${newjar.name}"/>
</target>
</project>2. 執(zhí)行流程
# 第一步:解壓 (依賴 init 和 unjar) ant unjar # [手動(dòng)操作] 此時(shí)進(jìn)入 unpacked_classes 目錄修改文件 # 第二步:重新打包 ant package
核心避坑與最佳實(shí)踐
為了確保你的 JAR 包修改后能正常運(yùn)行,請(qǐng)務(wù)必關(guān)注以下幾點(diǎn):
| 關(guān)注點(diǎn) | 說(shuō)明 |
|---|---|
| 壓縮級(jí)別 | Spring Boot 的 BOOT-INF/lib 下的依賴包必須保持 STORED(不壓縮)狀態(tài),否則類加載器無(wú)法正確讀取。 |
| 目錄結(jié)構(gòu) | 嚴(yán)禁改變 META-INF、BOOT-INF 和 org 目錄的層級(jí)關(guān)系。 |
| 數(shù)字簽名 | 如果原 JAR 包有數(shù)字簽名(META-INF/*.SF, *.RSA),修改內(nèi)容后會(huì)導(dǎo)致簽名失效。生產(chǎn)環(huán)境需重新簽名,測(cè)試環(huán)境可刪除簽名文件。 |
| 清單文件 | 確保 MANIFEST.MF 中的 Main-Class 指向正確(Spring Boot 通常是 org.springframework.boot.loader.JarLauncher)。 |
驗(yàn)證命令:
打包完成后,建議先檢查內(nèi)容結(jié)構(gòu):
jar -tf new-package.jar | head -n 20
到此這篇關(guān)于修改JAR文件并重新打包的兩種方式的文章就介紹到這了,更多相關(guān)修改JAR文件并重新打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中FileOutputStream中文亂碼問(wèn)題解決辦法
這篇文章主要介紹了java中FileOutputStream中文亂碼問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04
Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無(wú)損下線功能(案例講解)
這篇文章主要介紹了Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無(wú)損下線功能?,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)原理解讀
Nacos是阿里巴巴開(kāi)源的微服務(wù)組件,支持服務(wù)注冊(cè)、發(fā)現(xiàn)及配置管理,采用客戶端心跳維護(hù)、服務(wù)端推送與長(zhǎng)輪詢同步,結(jié)合健康檢查機(jī)制,實(shí)現(xiàn)高效可靠的微服務(wù)治理2025-08-08
Spring Boot攔截器Interceptor與過(guò)濾器Filter詳細(xì)教程(示例詳解)
本文詳細(xì)介紹了SpringBoot中的攔截器(Interceptor)和過(guò)濾器(Filter),包括它們的定義、作用范圍、使用場(chǎng)景、實(shí)現(xiàn)步驟、執(zhí)行順序、常見(jiàn)問(wèn)題及解決方案,感興趣的朋友跟隨小編一起看看吧2025-03-03

