一、簡介
jar 是隨 jdk 安裝的,在 jdk 安裝目錄下的 bin 目錄中,windows 下檔名為 jar.exe,linux 下檔名為 jar。它的執行需要用到 jdk 安裝目錄下 lib 目錄中的 tools.jar 檔案。不過我們除了安裝 jdk 什麼也不需要做,因為 sun 已經幫我們做好了。我們甚至不需要將tools.jar 放到 classpath 中。
jar 命令語法如下:
jar [vfm0m] [jar-檔案] [manifest-檔案] [-c 目錄] 檔名 ...
其中 是 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 c
vf 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 cvf
mhello.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
jar 命令詳解
jar 命令詳解 jar 是隨 jdk 安裝的,在 jdk 安裝目錄下的 bin 目錄中,windows 下檔名為 jar.exe,linux 下檔名為 jar。它的執行需要用到 jdk 安裝目錄下 lib 目錄中的 tools.jar 檔案。不過我們除了安裝 jdk 什麼也不需要做,因為 sun ...
jar 打包命令詳解
本文詳細講述了jar命令的用法,對於大家學習和總結jar命令的使用有一定的幫助作用。具體如下 jar包是j a中所特有一種壓縮文件,其實大家就可以把它理解為.zip包。當然也是有區別的,jar包中有乙個meta inf manifest.mf檔案,當你找成jar包時,它會自動生成。jar包是由jdk...
Jar命令打包
假如目錄結構如下所示,現在需要對classes下的所有包下的檔案打包。manifest.mf reference1.jar reference2.jar classes com sina lis test1.class test2.class jar cvmf test.jar manifest.m...