天天看點

記一次Unable to open nested entry ‘BOOT-INFlib.jar‘. It has been compressed

2022年8月23日

問題背景

前段時間由于工作失誤,誤将工程項目中某一個依賴包沒有添加@loadbalanced注解就直接打包依賴到的主工程中,并發送項目現場測試。出來混的,遲早都要還的。這不,今天就街道項目現場測試部同僚投訴,說是程式包無法啟動。報錯如下:

記一次Unable to open nested entry ‘BOOT-INFlib.jar‘. It has been compressed

排查原因

​ 當時第一反應是bis-service這個包咋這麼熟悉嗫,靈光一閃,WC,這不是我單獨打包替到主工程包裡面的那個依賴包麼。那這個問題的排查思路也就出來了:

  • 将bis-service替換到程式包的lib時出錯
  • bis-service包本身有錯

    如果bis-service包本身含錯,報錯資訊應該不是這樣,是以問題産生的原因可以鎖定在使用bis-service替換到程式包lib過程中。

問題産生原因分析

當時将bis-service替換到lib中時,主程式是已經打包成了jar,是以當時是直接以解壓軟體打開後,将bis-service.jar包替換緻lib下,重新壓縮。是否是壓縮軟體重新壓縮過程中,将bis-service.jar也壓縮了,是以導緻springboot不能讀取該包?

解決方案

既然不能直接使用解壓軟體,那就直接使用java自帶指令解壓後,然後将對應jar包替換到lib中,在使用java指令重新壓縮不就行了麼(我可真是個小天才)。

  1. 使用如下指令,将主程式包解壓, 其中xxx是需要解壓的jar包名
    jar -xvf xxx.jar
               
  2. 解壓後,将需要替換的jar包替換到/BOOT-INF/lib/ 下,再使用如下指令重新壓縮
    jar -cfM0 ./
               

結果

将替換好的主程式包java -jar,嘿,好了!

結果

将替換好的主程式包java -jar,嘿,好了!

記一次Unable to open nested entry ‘BOOT-INFlib.jar‘. It has been compressed