雖然現在已經有各種智能的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打開,直接刪除