JAR命令詳解

轉自:http://hubingforever.blog.163.com/blog/static/171040579201181111018523/


一、簡介
jar 是隨 JDK 安裝的,在 JDK 安裝目錄下的 bin 目錄中,Windows 下文件名爲 jar.exe,Linux 下文件名爲 jar。它的運行需要用到 JDK 安裝目錄下 lib 目錄中的 tools.jar 文件。不過我們除了安裝 JDK 什麼也不需要做,因爲 SUN 已經幫我們做好了。我們甚至不需要將tools.jar 放到 CLASSPATH 中。  
 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 文件包的時候可用。在jdk1.6中,我實驗該命令失敗。
文件名 ... 指定一個文件/目錄列表,這些文件/目錄就是要添加到 JAR 文件包中的文件/目錄。如果指定了目錄,那麼 jar 命令打包的時候會自動把該目錄中的所有文件和子目錄打入包中。  
二、常用實例
示例1 jar cf Hello.jar hello.class  
把當前目錄的hello.class文件打包到Hello.jar,且不顯示打包的過程。如果Hello.jar文件還不存在,就創建它,否則首先清空它。
示例2、 jar cvf Hello.jar hello.class  
把當前目錄的hello.class文件打包到Hello.jar,並顯示打包的過程。如果Hello.jar文件還不存在,就創建它,否則首先清空它。
打包過程顯示如下:
added manifest
adding: hello.class(in = 612) (out= 379)(deflated 38%)
示例3、 jar cvf Hello.jar hello.class  Util.class
把當前目錄的hello.class和Util.class文件打包到Hello.jar,並顯示打包的過程。如果Hello.jar文件還不存在,就創建它,否則首先清空它。
示例4、 jar cvf Hello.jar *.class
把當前目錄的所有class文件打包到Hello.jar,並顯示打包的過程。如果Hello.jar文件還不存在,就創建它,否則首先清空它。
示例5、 jar cvfM Hello.jar hello.class  
該命令與示例2 結果類似,但在Hello.jar不產生MANIFEST 文件,
示例6、 jar cvfm Hello.jar manifest.mf hello.class Util.class
運行結果與示例3 相似,只是用manifest.mf 指定了jar文件中MANIFEST文件的一些內容。
manifest.mf文件
Manifest-Version: 1.0
Main-Class: Hello
  
生成的jar文件中的MANIFEST文件爲
Manifest-Version: 1.0
Created-By: 1.6.0_11 (Sun Microsystems Inc.)
Main-Class: Hello

示例7、 jar cvfm Test.jar  manifest.mf com\robin\*.class
把com\robin目錄的所有class文件打包到Test.jar,並顯示打包的過程。如果Test.jar文件還不存在,就創建它,否則首先清空它。
注意:jar命令默認是以當前目錄作爲class的根目錄,所以對於com\robin\test.class文件,在jar解壓後,test.class文件也在其解壓目錄的com\robin目錄下。
示例8、 jar cvfm Test.jar  manifest.mf com
把com整個目錄包到Test.jar,並顯示打包的過程。如果Test.jar文件還不存在,就創建它,否則首先清空它。
注意:jar命令默認是以當前目錄作爲class的根目錄,所以對於com\robin\test.class文件,在jar解壓後,test.class文件也在其解壓目錄的com\robin目錄下。
示例9、 jar tf Hello.jar 
列出Hello.jar包含的文件清單.
對於示例6生成的Hello.jar結果如下:
META-INF/
META-INF/MANIFEST.MF
hello.class
Util.class
示例10、 jar tvf Hello.jar
顯現Hello.jar包含的文件的消息信息.
對於示例6生成的Hello.jar結果如下:  
     0 Sun Sep 11 15:06:10 KST 2011 META-INF/
    90 Sun Sep 11 15:06:10 KST 2011 META-INF/MANIFEST.MF
   612 Sat Sep 10 14:53:14 KST 2011 hello.class
   267 Sat Sep 10 14:53:14 KST 2011 Util.class
示例11、jar xf Hello.jar  
解壓Hello.jar 到當前目錄,不顯示任何信息,對於示例6 生成的 test.jar,解開後的目錄結構如下:  
  ==  
  |-- META-INF  
  |  `-- MANIFEST  
  `-- hello.class
       `-- Util.class
示例12、jar xvf Hello.jar  
示例11相似,只是對於解壓過程有詳細信息顯示,如:  
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
 inflated: hello.class
 inflated: Util.class
三、一些技巧  
3.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/  
3.2、 使用其他工具創建JAR 文件  
上面提到 JAR 文件就是包含了META-INF/MANIFEST的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具創建所需要 ZIP 壓縮包,再往這個 ZIP 壓縮包中添加一個包含 MANIFEST 文件的 META-INF 目錄即可。對於使用 jar 命令的 -m 參數指定清單文件的情況,只需要將這個 MANIFEST 按需要修改即可。  
3.3、使用 jar 命令創建 ZIP 文件  
有些 Linux 下提供unzip 命令,但沒有 zip 命令,所以需要可以對 ZIP 文件進行解壓,即不能創建 ZIP 文件。如要創建一個 ZIP 文件,使用帶 -M 參數的 jar 命令即可,因爲 -M 參數表示製作 JAR 包的時候不添加 MANIFEST 清單,那麼只需要在指定目標 JAR 文件的地方將 .jar 擴展名改爲 .zip 擴展名,創建的就是一個不折不扣的 ZIP 文件了,如將示例8略作改動:  
jar cvfM test.zip com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章