JAR 文件就是 Java Archive File,顧名思意,它的應用是與 Java 息息相關的,是 Java 的一種文檔格式。JAR 文件非常類似 ZIP 文件——準確的說,它就是 ZIP 文件,所以叫它文件包。JAR 文件與 ZIP 文件唯一的區別就是在 JAR 文件的內容中,包含了一個 META-INF/MANIFEST.MF 文件,這個文件是在生成 JAR 文件的時候自動創建的。舉個例子,如果我們具有如下目錄結構的一些文件:
==
`-- test
`-- Test.class
把它壓縮成 ZIP 文件 test.zip,則這個 ZIP 文件的內部目錄結構爲:
test.zip
`-- test
`-- Test.class
如果我們使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,則這個 JAR 文件的內部目錄結構爲:
其實不然,如果開發者能夠製作一個可執行的 JAR 文件包交給用戶,那麼用戶使用起來就方便了。在 Windows 下安裝 JRE (Java Runtime Environment) 的時候,安裝文件會將 .jar 文件映射給 javaw.exe 打開。那麼,對於一個可執行的 JAR 文件包,用戶只需要雙擊它就可以運行程序了,和閱讀 .chm 文檔一樣方便 (.chm 文檔默認是由 hh.exe 打開的)。那麼,現在的關鍵,就是如何來創建這個可執行的 JAR 文件包。
創建可執行的 JAR 文件包,需要使用帶 cvfm 參數的 jar 命令,同樣以上述 test 目錄爲例,命令如下:
jar cvfm test.jar manifest.mf test
這裏 test.jar 和 manifest.mf 兩個文件,分別是對應的參數 f 和 m,其重頭戲在 manifest.mf。因爲要創建可執行的 JAR 文件包,光靠指定一個 manifest.mf 文件是不夠的,因爲 MANIFEST 是 JAR 文件包的特徵,可執行的 JAR 文件包和不可執行的 JAR 文件包都包含 MANIFEST。關鍵在於可執行 JAR 文件包的 MANIFEST,其內容包含了 Main-Class 一項。這在 MANIFEST 中書寫格式如下:
Main-Class: 可執行主類全名(包含包名)
例如,假設上例中的 Test.class 是屬於 test 包的,而且是可執行的類 (定義了 public static void main(String[]) 方法),那麼這個 manifest.mf 可以編輯如下:
在介紹 JAR 文件的時候就已經說過了,JAR 文件實際上就是 ZIP 文件,所以可以使用常見的一些解壓 ZIP 文件的工具來解壓 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等來解壓是因爲它們解壓比較直觀,方便。而使用 unzip,則是因爲它解壓時可以使用 -d 參數指定目標目錄。
在解壓一個 JAR 文件的時候是不能使用 jar 的 -C 參數來指定解壓的目標的,因爲 -C 參數只在創建或者更新包的時候可用。那麼需要將文件解壓到某個指定目錄下的時候就需要先將這具 JAR 文件拷貝到目標目錄下,再進行解壓,比較麻煩。如果使用 unzip,就不需要這麼麻煩了,只需要指定一個 -d 參數即可。如:
unzip test.jar -d dest/
2) 使用 WinZip 或者 WinRAR 等工具創建 JAR 文件
上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具創建所需要 ZIP 壓縮包,再往這個 ZIP 壓縮包中添加一個包含 MANIFEST 文件的 META-INF 目錄即可。對於使用 jar 命令的 -m 參數指定清單文件的情況,只需要將這個 MANIFEST 按需要修改即可。
3) 使用 jar 命令創建 ZIP 文件
有些 Linux 下提供了 unzip 命令,但沒有 zip 命令,所以需要可以對 ZIP 文件進行解壓,即不能創建 ZIP 文件。如要創建一個 ZIP 文件,使用帶 -M 參數的 jar 命令即可,因爲 -M 參數表示製作 JAR 包的時候不添加 MANIFEST 清單,那麼只需要在指定目標 JAR 文件的地方將 .jar 擴展名改爲 .zip 擴展名,創建的就是一個不折不扣的 ZIP 文件了,如將上一節的第 3) 個例子略作改動: