jar更新jar包內(nèi)的class以及修改class實(shí)現(xiàn)方式
一、提取Jar 內(nèi)文件
#提取jar內(nèi)的配置文件 jar -xvf a.jar META-INF\plugin.xml -已解壓: META-INF/plugin.xml #提取jar內(nèi)的class文件, 提示:反編譯為java文件,修改后再使用javac xxx.java編譯為class, jar -xvf a.jar io.config.**.abc.class -已解壓: io.config.**.abc.class
二、更新jar內(nèi)的資源
目錄路徑與Jar包 class文件目錄保持一致
#更新a.jar包下的 META-INF\plugin.xml jar -uvf a.jar META-INF\plugin.xml #更新a.jar包下的 io.config.**.abc.class jar -uvf a.jar io\...\abc.class
jar -xvf 解壓出來(lái)如下,修改文件, 執(zhí)行 jar -uvf 更新命令 即可。
-
三、代碼直接修改Jar包內(nèi)的Class(這種方式要明確知道自己在干什么)
隨便一個(gè)java工程引入
1、maven引入javassist
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.21.0-GA</version>
</dependency>2、java代碼執(zhí)行修改
public static void main(String[] args) {
try {
ClassPool pool = ClassPool.getDefault();
//需要修改的jar包
pool.insertClassPath("C:\\Users\\Administrator\\a.jar");
//獲取到class
CtClass driverclass = pool.get("io.github.plugin.cofig.xxxxxxclass");
//獲取class內(nèi)聲明的方法,更改里面的內(nèi)容
driverclass.getDeclaredMethod("getMsg").setBody("return false;");
//將此修改的Class輸出至目錄中
driverclass.writeFile("D:\\javassistout");
} catch (NotFoundException e) {
throw new RuntimeException(e);
} catch (CannotCompileException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
詳解:
- jar 命令有生成、查看、更新、解開(kāi) jar 包的作用,包含 META-INF/MANIFEST.MF 文件。
- 它是 jar 包生成的時(shí)候,自動(dòng)創(chuàng)建的,主要負(fù)責(zé)制定 jar 包的 main 文件位置和當(dāng)前文件夾。
參數(shù)可選項(xiàng):
-x解壓已歸檔的指定(或所有)文件-v在標(biāo)準(zhǔn)輸出中生成詳細(xì)輸出-f指定歸檔文件名-c創(chuàng)建新的歸檔文件-u更新現(xiàn)有的歸檔文件-t列出歸檔目錄-m包含指定清單文件中的清單信息-e為捆綁到可執(zhí)行 jar 文件的獨(dú)立應(yīng)用程序指定應(yīng)用程序入口點(diǎn)-o僅存儲(chǔ),不使用任何 zip 壓縮-i為指定的 jar 文件生成索引信息-M不創(chuàng)建條目的清單文件-C更改為指定的目錄并包含其中的文件
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決
這篇文章主要介紹了RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
gateway與spring-boot-starter-web沖突問(wèn)題的解決
這篇文章主要介紹了gateway與spring-boot-starter-web沖突問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
解析Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)
大家都很糾結(jié)這個(gè)問(wèn)題在使用getServletContext().getRealPath()得到的是臨時(shí)文件的路徑,每次重啟服務(wù),這個(gè)臨時(shí)文件的路徑還好變更,下面小編通過(guò)本文給大家分享Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)路徑的問(wèn)題,一起看看吧2021-05-05
Intellij Idea 多模塊Maven工程中模塊之間無(wú)法相互引用問(wèn)題
這篇文章主要介紹了Intellij Idea 多模塊Maven工程中模塊之間無(wú)法相互引用問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java如何定位進(jìn)程中占用CPU或內(nèi)存最多的線程
在排查?Java?性能問(wèn)題時(shí),定位占用?CPU?或內(nèi)存最多的線程是關(guān)鍵步驟,本文為大家介紹了針對(duì)兩種場(chǎng)景的具體排查方法,希望對(duì)大家有一定的幫助2025-05-05
淺談java中類名.class, class.forName(), getClass()的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java中類名.class, class.forName(), getClass()的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

