問題背景:
項目組發現線上版本問題后,定位是由於項目依賴的某個jar包中有個小BUG。
解決方案:
在修改了對應的java文件后,編譯出對應的class文件。從生產環境下載項目jar包,解壓后,找到對應的依賴jar包,使用好壓軟件打開,用修改后的class文件覆蓋原來的文件。
然后使用jar -cf0M XXX.jar -C imp . 命令將之前解壓的文件夾重新打包成可執行jar包。有關jar命令參數可以參考下面(最后的“.”表示打包imp文件夾中所有文件):
用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 選項: -c 創建新檔案 -t 列出檔案目錄 -x 從檔案中提取指定的 (或所有) 文件 -u 更新現有檔案 -v 在標准輸出中生成詳細輸出 -f 指定檔案文件名 -m 包含指定清單文件中的清單信息 -n 創建新檔案后執行 Pack200 規范化 -e 為捆綁到可執行 jar 文件的獨立應用程序 指定應用程序入口點 -0 僅存儲; 不使用任何 ZIP 壓縮 -P 保留文件名中的前導 '/' (絕對路徑) 和 ".." (父目錄) 組件 -M 不創建條目的清單文件 -i 為指定的 jar 文件生成索引信息 -C 更改為指定的目錄並包含以下文件 如果任何文件為目錄, 則對其進行遞歸處理。 清單文件名, 檔案文件名和入口點名稱的指定順序 與 'm', 'f' 和 'e' 標記的指定順序相同。 示例 1: 將兩個類文件歸檔到一個名為 classes.jar 的檔案中: jar cvf classes.jar Foo.class Bar.class 示例 2: 使用現有的清單文件 'mymanifest' 並 將 foo/ 目錄中的所有文件歸檔到 'classes.jar' 中: jar cvfm classes.jar mymanifest -C foo/ .
注意:不能直接將新的依賴jar包通過好壓替換到項目jar包中,運行jar包時會出現如下錯誤信息:
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/icity-core-2.1.0.jar at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:113) at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:87) at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:69) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/icity-core-2.1.0.jar' at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:261) at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:247) at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:109) ... 4 more Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/icity-core-2.1.0.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:287) at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:269) at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:258) ... 6 more
這個錯誤的意思是無法打開其中依賴的jar包,因為它被壓縮了。所以我才用jar命令其中的參數-0表示僅存儲,不做任何zip壓縮。