1. 程式人生 > >命令列壓縮jar包cvfm和cvfe

命令列壓縮jar包cvfm和cvfe

初學Java,在學習JAR壓縮時,corejava教材中看似長篇大論,實講沒有講清楚,這裡作下筆記,說明實際使用中體會到的引數“cvfm” 和”cvfe”的區別:
兩者主要區另在於”m”和”e”(m即先寫好MANIFEST.MF檔案,然後打包,e則是打包時指定主函式的類名,自動填入MANIFEST.MF中):

cvfm用法如:jar cvfm Myprogram.jar MANIFEST.MF *.class

  • Myprogram.jar 是你想壓縮的jar包名
  • MANIFEST.MF 是人工按格式編寫的manifest.mf型別清單檔案,這裡如果帶有引數”m”,則列出的第一個的檔案必須是name.mf(檔名隨意,字尾為.mf即可),而且在此文中必須指明主程式所在的class檔案及主程式的包路徑(如果有包),假如主程式在包 examples下,則在MANIFEST.MF中必須寫明:
    Main-class: examples.HelloWorld (注意冒號後有一個空格,包名和主類名根據自身情況修改)
    MANIFEST.MF的內容

    否則在進行打包時會提示:invalid header field
    後面的*.class 則是要打包的檔案,如果在一個資料夾中,如例子中就在examples資料夾中,則可以用 .\examples 進行打包。系統會直接將MANIFEST.MF 檔案中內容複製到包中其中路徑META-INF/MANIFEST.MF檔案中。在生成的JAR壓縮包中,被壓縮的檔案會放在examples資料夾中,即也會帶上包路徑進行復制和壓縮。

完整過程:

  1. 寫好*.MF檔案,放入所要壓縮成jar包的class資料夾下。該檔案可以隨意命名,字尾得是.MF,我命名的為test.MF。examples資料夾下為編譯的HelloWorld.class檔案,其實這裡的examples就是包名。
    這裡寫圖片描述

    examples資料夾:
    這裡寫圖片描述
    test.MF內容:
    這裡寫圖片描述
  2. 開啟cmd,進入當前目錄下,輸入 jar cvfm test.jar test.MF .\examples
    這裡寫圖片描述
  3. 壓縮成功,進入資料夾檢視,test.jar已存在
    這裡寫圖片描述
  4. 在cmd中執行test.jar。繼續在當前目錄下輸入 java -jar test.jar
    這裡寫圖片描述
    執行成功!

cvfe用法如:jar cvfe Myprogram.jar examples.HelloWorld *.class
這種情況下,e代表會根據第一個檔名(必須為主程式的檔名,不帶.class字尾),此例中為examples.HelloWorld 。則系統會自動在打包中建立META-INF/MANIFEST.MF 檔案並把Main-class: examples.HelloWorld複製進去,這個路徑如果填得不對,那麼複製進去的路徑就是錯的,導致壓縮成功後再執行時,會無反應。

總結:引數m是採用複製自編的 .mf檔案內容的形式,引數e則是採用複製指令中的主程式檔名的形式,如果主程式在package中,對不管哪種引數,對應的包路徑都要帶齊。兩個引數,只是實現形式不一樣,但目的都是為了把主程式入口資訊放入META-INF/manifest.mf檔案中,另META-INF/manifest.mf檔案是在JAR打包過程中,系統自己建立的目錄,檔案manifest.mf中專門用來存放主程式入口資訊及其他檔案清單資訊,打包完成後,在執行打包檔案時,系統會讀取META-INF/manifest.mf檔案中的主程式入口資訊,根據主程式名.class進行響應,如果一開始給的主程式入口資訊是錯誤的,那麼即使打包成功了,在後續執行打包檔案時也會無響應或是無法訪問。