1. 程式人生 > >jar命令+7z:建立,替換,修改,刪除Jar, war, ear包中的檔案

jar命令+7z:建立,替換,修改,刪除Jar, war, ear包中的檔案

雖然現在已經有各種智慧的IDE可以為我們生成jar包,war包,ear包,甚至帶上了自動替換,部署的功能。但一定會有那麼些時候,你需要修改或是替換jar包,war包,ear包中的某個檔案而不是整個重新生成。比如說,你有一個ear包已經部署到客戶的伺服器上,運行了有那麼久了,版本也很老,但一個讓你頭痛的bug需要立即在客戶那裡fix,這個ear包很大,並且客戶的網路很慢,你也沒有那麼老的整套程式碼,但是你明白只需要改一個class檔案就可以修復了。如果你按照正常的流程,那一般是你得提交程式碼,由CI編出一個rpm包,在客戶的伺服器上重新部署,再驗證,這時候黃花菜都涼了,客戶心裡已經罵了你無數遍的無能。
那這時候,我們只有讓熱替換出場了(我之前寫過一篇文章是關於熱部署的,但那是通過JDK自帶的功能,這裡要說的是硬生生的替換檔案),很慶幸,現在所有的

Java應用程式伺服器都支援熱部署。所以我們只需要進入到應用程式伺服器的路徑,把我們修改了bug的class檔案或jar檔案,whatever else,替換到ear包裡面就可以了。這時應用伺服器就會檢查到ear包發生了更新,會自動熱部署。
這裡要用到工具是兩個,jar和7z,為什麼jar和7z或者zip被一起相提並論,因為jar包,war包,ear包,本質上都是zip包或稱為壓縮包

jar command

這是JDK自帶的工具。有的放矢,只需知道以下四大命令外加vf字尾:

命令 解釋
c 建立一個新的壓縮包
t 列出壓縮包中的所有內容
x 將指定檔案或者整個壓縮包解壓到當前目錄
u 將當前壓縮包更新
v 將你觸發的所有的動作都列印到標準輸出
f 可以指定壓縮包的名字

注意: 這裡的壓縮包可以是jar, war, ear或者what ever else,你只需在呼叫jar的時候,指定你要的字尾名。

然後,接下來的例子,你都是用 jar -cvf或jar -xvf或jar -uvf

建立壓縮包:

這個不是我們的重點,只是給大家表述一下jar -cvf的本質是壓縮包,而且是啥字尾名都行。假設有如下檔案:
這裡寫圖片描述

呼叫jar -cvf bb.cc *, 將資料夾下所有檔案壓縮到檔案bb.cc中,你也可以是bb.jar, bb.war, bb.ear
這裡寫圖片描述

用7z或者zip開啟:
這裡寫圖片描述

表明這是一個簡單的壓縮包,只是多了一個META-INFO資料夾而已。無他

替換jar, war, ear包中的檔案:

這是我們的重點,主要用到的是一個命令組合, jar -tvf + jar -xvf + jar -uvf。

發揮一下想象力,這個example.ear是部署在伺服器上的,編譯和部署的流程很複雜,你不想重新編譯和部署這個exmple.ear只想替換裡面的檔案。

先用jar -tvf看一下檔案裡面有啥,假設我們要替換裡面EjbComponent.jar

這裡寫圖片描述

這個jar很小,50k, 我們修改一下這個檔案,放到同一個目錄:
這裡寫圖片描述

執行一下jar -uvf example.ear EjbComponent.jar,我們可以看到新的EjbComponent.jar被替換到了ear包中
這裡寫圖片描述

這時再發揮一下想象力,這個ear是在應用伺服器的deployment目錄中,hot deploy是開啟的,伺服器會發現這個ear包的建立時間更新了,會重新部署這個ear包

注意:上面的例子中,ear包的目錄結構是很簡單的,所有的檔案基本都在根目錄,如果你要替換子目錄中的檔案,那你需要先執行jar -xvf命令,把你需要替換的檔案先解壓縮出來(會連帶目錄結構一起解壓到當前目錄),然後再將新檔案替換解壓之後的目錄結構中的檔案,再執行jar -uvf。(如有不懂,評論裡面問)

修改jar, war, ear包中的檔案:

如果是修改,那證明基本上你要修改的不可能是class檔案或jar檔案,一定是什麼xml,properties等被打包在壓縮包中的檔案,這時就用7z出馬了,直接開啟壓縮,編輯,即可:
這裡寫圖片描述

編輯之後儲存,
這裡寫圖片描述

刪除jar, war, ear包中的檔案:

簡單啊,7z開啟,直接刪除
這裡寫圖片描述