1. 程式人生 > >jar檔案包及jar包命令詳解

jar檔案包及jar包命令詳解

JAR檔案包及jar命令詳解
常常在網上看到有人詢問:如何把 java 程式編譯成 .exe 檔案。通常回答只有兩種,一種是製作一個可執行的 JAR 檔案包,然後就可以像.chm 文件一樣雙擊運行了;而另一種是使用 JET 來進行 編譯。但是 JET 是要用錢買的,而且據說 JET 也不是能把所有的 Java 程式都編譯成執行檔案,效能也要打些折扣。所以,使用製作可執行 JAR 檔案包的方法就是最佳選擇了,何況它還能保持 Java 的跨平臺特性。

  下面就來看看什麼是 JAR 檔案包吧:

  1. JAR 檔案包

  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 檔案的內部目錄結構為:

  test.jar

  |-- META-INF

  |  `-- MANIFEST.MF

  `-- test

    `--Test.class

  2. 建立可執行的 JAR 檔案包

  製作一個可執行的 JAR 檔案包來發布你的程式是 JAR 檔案包最典型的用法。

  Java 程式是由若干個 .class 檔案組成的。這些 .class 檔案必須根據它們所屬的包不同而分級分目錄存放;執行前需要把所有用到的包的根目錄指定給 CLASSPATH 環境變數或者 java 命令的 -cp 引數;執行時還要到控制檯下去使用 java 命令來執行,如果需要直接雙擊執行必須寫 Windows 的批處理檔案 (.bat) 或者 Linux 的 Shell 程式。因此,許多人說,Java 是一種方便開發者苦了使用者的程式設計語言。

  其實不然,如果開發者能夠製作一個可執行的 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 可以編輯如下:

Main-Class: test.Test <回車>

  這個 manifest.mf 可以放在任何位置,也可以是其它的檔名,只需要有 Main-Class: test.Test 一行,且該行以一個回車符結束即可。建立了 manifest.mf 檔案之後,我們的目錄結構變為:

  ==

  |-- test

  |  `-- Test.class

  `-- manifest.mf

  這時候,需要到 test 目錄的上級目錄中去使用 jar 命令來建立 JAR 檔案包。也就是在目錄樹中使用“==”表示的那個目錄中,使用如下命令:

jar cvfm test.jar manifest.mf test

  之後在“==”目錄中建立了 test.jar,這個 test.jar 就是執行的 JAR 檔案包。執行時只需要使用 java -jar test.jar 命令即可。

  需要注意的是,建立的 JAR 檔案包中需要包含完整的、與 Java 程式的包結構對應的目錄結構,就像上例一樣。而 Main-Class 指定的類,也必須是完整的、包含包路徑的類名,如上例的 test.Test;而且在沒有打成 JAR 檔案包之前可以使用 java <類名> 來執行這個類,即在上例中 java test.Test 是可以正確執行的 (當然要在 CLASSPATH 正確的情況下)。

  3. jar 命令詳解

  jar 是隨 JDK 安裝的,在 JDK 安裝目錄下的 bin 目錄中,Windows 下檔名為 jar.exe,Linux 下檔名為 jar。它的執行需要用到 JDK 安裝目錄下 lib 目錄中的 tools.jar 檔案。不過我們除了安裝 JDK 什麼也不需要做,因為 SUN 已經幫我們做好了。我們甚至不需要將 tools.jar 放到 CLASSPATH 中。

  使用不帶任何的 jar 命令我們可以看到 jar 命令的用法如下:

  jar {ctxu}[vfm0M] [jar-檔案] [manifest-檔案] [-C 目錄] 檔名 ...

  其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一個,它們分別表示:

   -c 建立新的 JAR 檔案包

   -t 列出 JAR 檔案包的內容列表

   -x 展開 JAR 檔案包的指定檔案或者所有檔案

   -u 更新已存在的 JAR 檔案包 (新增檔案到 JAR 檔案包中)

     [vfm0M] 中的選項可以任選,也可以不選,它們是 jar 命令的選項引數

   -v 生成詳細報告並列印到標準輸出

   -f 指定 JAR 檔名,通常這個引數是必須的

   -m 指定需要包含的 MANIFEST 清單檔案

   -0 只儲存,不壓縮,這樣產生的 JAR 檔案包會比不用該引數產生的體積大,但速度更快

   -M 不產生所有項的清單(MANIFEST〕檔案,此引數會忽略 -m 引數

     [jar-檔案] 即需要生成、檢視、更新或者解開的 JAR 檔案包,它是 -f 引數的附屬引數

     [manifest-檔案] 即 MANIFEST 清單檔案,它是 -m 引數的附屬引數

     [-C 目錄] 表示轉到指定目錄下去執行這個 jar 命令的操作。它相當於先使用 cd 命令轉該目錄下再執行不帶 -C 引數的 jar 命令,它只能在建立和更新 JAR 檔案包的時候可用。  

  檔名 ... 指定一個檔案/目錄列表,這些檔案/目錄就是要新增到 JAR 檔案包中的檔案/目錄。如果指定了目錄,那麼 jar 命令打包的時候會自動把該目錄中的所有檔案和子目錄打入包中。

  下面舉一些例子來說明 jar 命令的用法:

  1) jar cf test.jar test

  該命令沒有執行過程的顯示,執行結果是在當前目錄生成了 test.jar 檔案。如果當前目錄已經存在 test.jar,那麼該檔案將被覆蓋。

  2) jar cvf test.jar test

  該命令與上例中的結果相同,但是由於 v 引數的作用,顯示出了打包過程,如下:

  標明清單(manifest)

  增加:test/(讀入= 0) (寫出= 0)(儲存了 0%)

  增加:test/Test.class(讀入= 7) (寫出= 6)(壓縮了 14%)

  3) jar cvfM test.jar test

  該命令與 2) 結果類似,但在生成的 test.jar 中沒有包含 META-INF/MANIFEST 檔案,打包過程的資訊也略有差別:

  增加:test/(讀入= 0) (寫出= 0)(儲存了 0%)

  增加:test/Test.class(讀入= 7) (寫出= 6)(壓縮了 14%)

  4) jar cvfm test.jar manifest.mf test

  執行結果與 2) 相似,顯示資訊也相同,只是生成 JAR 包中的 META-INF/MANIFEST 內容不同,是包含了 manifest.mf 的內容

  5) jar tf test.jar

  在 test.jar 已經存在的情況下,可以檢視 test.jar 中的內容,如對於 2) 和 3) 生成的 test.jar 分別應該此命令,結果如下;

  對於 2)

  META-INF/

  META-INF/MANIFEST.MF

  test/

  test/Test.class

  對於 3)

  test/

  test/Test.class

  6) jar tvf test.jar

  除顯示 5) 中顯示的內容外,還包括包內檔案的詳細資訊,如:

  0 Wed Jun 19 15:39:06 GMT 2002 META-INF/

  86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF

  0 Wed Jun 19 15:33:04 GMT 2002 test/

  7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class

  7) jar xf test.jar

  解開 test.jar 到當前目錄,不顯示任何資訊,對於 2) 生成的 test.jar,解開後的目錄結構如下:

  ==

  |-- META-INF

  |  `-- MANIFEST

  `-- test

    `--Test.class

jar xvf test.jar

  執行結果與 7) 相同,對於解壓過程有詳細資訊顯示,如:

  建立:META-INF/

  展開:META-INF/MANIFEST.MF

  建立:test/

  展開:test/Test.class

  9) jar uf test.jar manifest.mf

  在 test.jar 中添加了檔案 manifest.mf,此使用 jar tf 來檢視 test.jar 可以發現 test.jar 中比原來多了一個 manifest。這裡順便提一下,如果使用 -m 引數並指定 manifest.mf 檔案,那麼 manifest.mf 是作為清單檔案 MANIFEST 來使用的,它的內容會被新增到 MANIFEST 中;但是,如果作為一般檔案新增到 JAR 檔案包中,它跟一般檔案無異。

  10) jar uvf test.jar manifest.mf

  與 9) 結果相同,同時有詳細資訊顯示,如:

  增加:manifest.mf(讀入= 17) (寫出= 19)(壓縮了 -11%)

  4. 關於 JAR 檔案包的一些技巧

  1) 使用 unzip 來解壓 JAR 檔案

  在介紹 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) 個例子略作改動:

相關推薦

Linux學習命令匯總十一——Linux進程管理、作業控制進程命令

ps top vmstat dmstat 進程管理 本章Blog相關Linux知識點 進程(process):進程是程序的執行實例,即運行中的程序,也是程序的副本;程序放置於磁盤中,而進程放置於內存中;進程的啟動及調度均是由內核發起的。init是所有進程的父進程,而子進程是由fork

linux命令(19)修改檔案屬性 lsattr、chattr命令

修改檔案屬性 Linux檔案系統裡的檔案和目錄全都關聯使用者、使用者組和其他使用者的讀、寫和執行許可權。此外,還可能存在其他特定檔案系統型別才有的檔案和目錄相關屬性。 ext2和ext3檔案系統檔案可以選用一些特殊屬性。使用lsattr命令可以列出這些屬性。大部分屬性都晦澀

svn status 列印工作拷貝檔案和目錄的狀態命令

名稱 svn status ― 列印工作拷貝檔案和目錄的狀態。 概要 svn status [PATH...]

jar檔案jar命令

JAR檔案包及jar命令詳解常常在網上看到有人詢問:如何把 java 程式編譯成 .exe 檔案。通常回答只有兩種,一種是製作一個可執行的 JAR 檔案包,然後就可以像.chm 文件一樣雙擊運行了;而另一種是使用 JET 來進行 編譯。但是 JET 是要用錢買的,而且據說 J

liunx安裝rpmyum命令

liunx rpm yum rpm及yum的優缺點 **RPM是由紅帽公司開發的軟件包管理方式,使用rpm我們可以方便的進行軟件的安裝、查詢、卸載、升級等工作。但是rpm軟件包之間的依賴性問題往往會很繁瑣,尤其是軟件由多個rpm包組成時。YUM(全稱為 Yellow dog Updater, Mo

jar掃描

public PackageScanner() { } //掃描包 private void scanFile(File currentFile, String packageName) { //File[] fileList = file.listFiles(); //得到該資料夾下

Jar/War/Ear等的作用與區別

  以客戶角度來看,jar檔案就是一種封裝格式,使用者不需要知道jar包中有多少個.class格式的檔案及每個檔案中的功能與作用,也可以得到相應的訪問的結果。java中除了jar格式還有war和ear等包檔案。   JAR W

執行jar檔案---如何呼叫jar內的配置檔案

這段時間隨便寫了一個小工具,一直用ide工具跑比較麻煩,試圖將工具打包成jar 利用cmd  java -jar test.jar 去執行這個工具發現 log4j 的配置檔案沒找到。 如上圖,我打成jar以後 我在 ide工具內 程式碼 如下圖 this.

Eclipse中如何生成jarjar的正確匯入

Eclipse中如何生成jar包並匯入到專案中 * A:jar是什麼? * jar是多個class檔案的壓縮包。 * B:jar有什麼用? * 用別人寫好的東西,從GitHub中找出他的library

基於Java的打包jar、war、ear的作用與區別

以最終客戶的角度來看,JAR檔案就是一種封裝,他們不需要知道jar檔案中有多少個.class檔案,每個檔案中的功能與作用,同樣可以得到他們希望的結果。除jar以外對於J2EE來說還有war和ear。區別見下表: JAR WAR EAR 英文 Java Archive fi

json-lib.jar開發包依賴的下載地址

首先要去官方下載json-lib工具包 下載地址: http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/ 目前最新的是2.4的版本,本示例中使用的是v2.3;json-lib還需要以下依賴包: jakarta commons

ant的高階使用,ant命令,ant打包,ant編譯後打包去掉jar檔案

在日常的專案開發中,我們可以經常性的需要打包測試,尤其是開發環境是windows,而實際環境則是linux。 這樣的話,很多程式設計師要一會打一個包,一會打一個包,這些包可能會很大,實際上只有程式碼部

json-lib.jar開發包依賴的下載地址免費

首先要去官方下載json-lib工具包 下載地址: http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/ 目前最新的是2.4的版本,本示例中使用的是v2.3;json-lib還需要以下依賴包

Gradle命令與導入第三方

cst x86 簽名 更新 清除 容易 onu nali nag Android Studio + Gradle的組合用起來非常方便,很多第三方開源項目也早都遷移到了Studio,為此今天就來介紹下查看、編譯並導入第三方開源項目的方法。 Sublime + Termina

jar 打包命令

mar str span 讓我 article sdn 添加文件 ani style 本文詳細講述了JAR命令的用法,對於大家學習和總結jar命令的使用有一定的幫助作用。具體如下: JAR包是Java中所特有一種壓縮文檔,其實大家就可以把它理解為.zip包。當然也是有區別的

TCPdump抓命令

通信 代碼優化 3次握手 當前 導致 命令行 date 十進制 LG tcpdump是一個用於截取網絡分組,並輸出分組內容的工具。tcpdump憑借強大的功能和靈活的截取策略,使其成為類UNIX系統下用於網絡分析和問題排查的首選工具。 tcpdump提供了源代碼,公開了接口

壓縮/打包/ 命令

打包壓縮 指定 txt 過濾 解壓縮 thead tar tar打包工具 tro 壓縮&解壓 gzip gzip 壓縮級別1-9 1 壓縮級別最低 9壓縮級別最高 【默認級別6】 壓縮文件類型.gz 壓縮:gzip 壓縮文件名 【修改壓縮級別方法:gzip -1

Java中jar命令

 做專案的時候我們肯定接觸過很多jar包,那麼jar包是什麼呢?筆者瞭解到jar是java archive file 的簡寫。從名字就可以知道,它的應用與Java息息相關。下面就詳細介紹如何自己生成jar包,這樣我們管理我們自己的程式碼(尤其是一些比較重要而且不會或者很少有修改的程式碼)。  安裝好J

linux每日命令(30):Linux 使用者使用者組相關檔案命令

一. 使用者、使用者組概念及其檔案結構詳解 Linux使用者只有兩個等級:root及非root。Linux中還有一部分使用者,如:apache、mysql、nobody、ftp等,這些也都是非root使用者,即普通使用者。Linux的許可權實際是上不同使用者所能訪問的檔案的不同產生的假象。而這些假象的造成,

linux yum命令以及查詢當前哪些需要更新,與更新命令

yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及SUSE中的Shell前端軟體包管理器。基於RPM包管理,能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關係,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。yum提供了