官术网_书友最值得收藏!

2.4 jar文件的創建與查看

本節將詳細介紹如何實現最常用的打包方法。包括創建.jar文件、查看jar文件的內容、提取jar文件的內容、更新jar文件和運行打包的jar軟件。通過本章的學習,了解Java中jar工具的真正意義與功能。

說明

如果讀者采用完全自學,可以先忽略本節的內容,直接跳到第2.5節學習,等用到jar的時候再回來學習。

2.4.1 創建jar文件

創建.jar文件的基本命令格式為:

jar cf jar-file input-file(s)

其中每個選項或參數的含義如下:

?jar:啟動JDK的jar工具。

?c:該選項表示此時調用jar工具的目的是創建一個jar文件。

?jar-file:該選項表示打包的結果文件名,該文件生成后有.jar擴展名,該文件的名稱沒有要求,只要便于理解記憶即可。可以在創建jar文件時就在jar-file后添加.jar擴展名,默認不用添加擴展名。

?input-file(s):該參數表示添加到jar文件中的文件。該參數可以包含通配符*,也可以包含目錄(一個或多個),如果是目錄則把目錄下的所有文件依次打包進jar文件。

命令jar cf會在當前目錄下生成一個經過壓縮的jar文件,并且產生一個默認的manifest文件,該文件會列出jar文件中的所有文件。

還有一些選項可以添加到cf選項之間,這些選項及其含義如表2.2所示。

表2.2 jar工具選項以及含義

在了解了如何創建基本的jar文件和各種選項之后,下面通過一個創建jar文件的例子,來更具體地學習jar工具的具體實現方式和各種參數的含義。

【實例2.1】筆者設計了一個類MyJarTest,該類需要音頻資源和圖片資源,把該文件打包成一個jar文件,這樣就可在任何平臺上運行該程序。該程序和資源放在目錄MyJarTest目錄下,文件結構如圖2.6所示。

圖2.6 MyJarTest目錄結構

說明

因為此時讀者還沒有學習類的知識,這里只是給出一個大概的過程讓讀者了解打包jar文件的流程,不需要讀者親自動手。如果讀者不感興趣,可以直接跳過2.4節。

其中包含兩個子目錄myaudio和myimages,這兩個子目錄中包含程序所需要的音頻和圖像信息。下面需要把上述文件打包成名為MyJarTest.jar的文件,首先在DOS窗口中轉到MyJarTest目錄下,在當前目錄下輸入打包的命令格式如下:

Jar cvf MyJarTest.jar MyJarTest.class myaudio myimages

說明

因為myaudio和myimages是目錄,所以Jar工具會迭代地訪問這些文件夾并把文件夾中的文件添加到MyJarTest.jar文件中。因為使用了cvf選項,所以在打包的過程中會顯示添加文件的內容。最后生成的MyJarTest.jar文件存儲在當前目錄下。圖2.7是創建壓縮的jar文件。

圖2.7 創建壓縮的jar文件

從圖2.7中可以看出創建該jar文件中的文件都經過了壓縮處理,并顯示了壓縮比例,如果不需要壓縮處理而創建不經過壓縮的jar文件,可以選擇0參數。

Java的jar工具提供了非壓縮的打包參數,是因為考慮到實際應用中的效率。如當用戶下載Applet肯定不希望過長的傳輸時間,如果該Applet采用壓縮過的jar文件,使用戶在下載之前先解壓壓縮文件,再經過網絡傳輸到客戶端,這樣就比較耗時,而采用不經過壓縮Applet的jar文件就減少了解壓縮的時間。創建非壓縮的jar文件的命令格式如下所示。

Jar cvf0 MyJarTest.jar MyJarTest.class myaudio myimages

輸出結果如圖2.8所示,這是創建未壓縮的jar文件。

圖2.8 創建未壓縮的jar文件

剛才講過Jar工具也接受使用*通配符的參數,如果在當前目錄下的所有文件都需要打包就可以使用通配符,它表示在當前目錄下的所有文件都需要打包成jar文件。可以采用如下的命令方式創建jar文件。

Jar cvf MyJarTest.jar *

該命令的執行結果與圖2.8相似,只是向MyJarTest.jar中添加的文件數量不同。

上述例子中,在jar文件中附帶了打包文件自己的路徑名和目錄結構。在查看jar文件時會清楚地看到這一點,如圖2.9所示。

說明

這里使用了查看jar文件內容的命令jar tf jar-file.jar,讀者不必關注其具體含義,關鍵是觀察文件的內容,注意文件的目錄結構。

Jar工具提供了一個-C選項,使創建的jar文件不保存被打包文件的相關路徑名。

下面舉例說明,假設用戶想把音頻文件和圖像文件創建為一個jar文件,并且該jar文件中的所有文件沒有目錄結構,即所有文件在最高層的同一目錄下。可以使用如下命令完成上述任務:

Jar cf ImageAudio.jar -C myimages . -C myaudio .

參數-C myimages告訴Jar工具進入myimages路徑,隨后告訴Jar工具將該目錄下的所有文件打包。參數-C myaudio告訴Jar工具進入myaudio路徑,隨后告訴Jar工具將該目錄下的所有文件打包。在參數-C、myimages和.之間必須有空格。為了顯示壓縮過程,這里使用cvf參數。執行結果如圖2.10所示。

圖2.9 查看MyJarTest.jar文件內容

圖2.10 使用-C參數壓縮并打包文件

在ImageAudio.jar創建成功后,該jar文件的內容列表如圖2.11所示。此時調用了查看jar文件的命令jar tf jar-file.jar。輸出如圖2.11所示。

注意

圖2.11中使用了查看jar文件內容的命令jar tf jar-file.jar,該命令顯示jar文件的內容,注意這里沒有文件的目錄結構,所有文件在一個目錄中。

如果沒有采用-C選項將音頻文件和圖像文件打包成jar文件,則該jar文件的內容為具有目錄結構的文件列表。使用命令jar cf ImageAudio.jar myimages myaudio來打包文件并使用jar tf ImageAudio.jar查看文件內容。文件內容列表如圖2.12所示。

圖2.11 查看ImageAudio.jar內容

圖2.12 查看帶目錄結構的ImageAudio.jar

2.4.2 查看jar文件的內容

查看文件的基本操作命令如下所示。

jar tf jar-file.jar

下面分析一下該命令的各參數或選項的含義。

?t選項說明查看jar文件的內容列表。

?f選項指明需要查看的jar文件必須在命令行中說明。

?jar-file參數是需要查看的jar文件的路徑和名字。

說明

選項t和f的順序可以互換,但是在二者之間不能有空格。上述命令的作用是jar文件的內容列表顯示在標準輸出裝置。也可以在tf之間增加v選項來產生關于文件長度、修改時間等的額外信息,并顯示在標準輸出裝置上。

【實例2.2】下面通過具體的例子說明如何查看jar文件的內容,以及顯示結果。使用Jar工具查看ImageAudio.jar文件的內容,注意這里的ImageAudio.jar文件是帶目錄結構的。命令格式如下:

jar tf ImageAudio.jar

該命令將ImageAudio.jar中的文件內容顯示在標準輸出中。圖2.13顯示查看ImageAudio.jar文件的內容。

說明

從輸出結果看,該ImageAudio.jar文件包含myimages和myaudio目錄下的文件,并且從輸出結果前兩行可以看出該jar文件包含了默認的manifest文件,META-INF/MANIFEST.MF,該文件有JAR工具在創建jar文件時自動產生。

圖2.13中所有的路徑名都是以“pathname/”形式出現,該路徑永遠是以相對路徑的方式出現,無論操作系統平臺是Windows、Linux或者Mac,這里的路徑名肯定不會出現絕對路徑。

采用選項v會顯示jar文件中所有文件的最后修改時間,命令格式如下所示。

jar tvf ImageAudio.jar

命令的輸出結果如圖2.14所示,通過選項cvf查看ImageAudio.jar內容。

圖2.13 查看ImageAudio.jar文件內容

圖2.14 通過選項cvf查ImageAudio.jar內容

2.4.3 提取jar文件的內容

提取文件jar文件內容的命令格式如下所示。

jar xf jar-file [archived-file(s)]

下面分析該命令的參數或選項含義。

?x選項說明提取jar文件的內容。

?f選項指明需要提取的jar文件必須在命令行中說明。

?jar-file參數是需要提取的jar文件的路徑和名字。

?archived-file(s)是可選參數,包含從jar-file中提取的文件的列表,如果沒有該可選項,則默認是提取jar-files中的所有文件。

說明

選項x和f的順序可以互換,但是在二者之間不能有空格。當執行提取文件操作時,Jar工具復制想要提取的文件,并把復制的文件存儲在當前目錄下,重新建立目錄結構。而原始的jar文件內容不發生變化。

【實例2.3】下面通過具體的例子說明如何提取jar文件的相關子文件。命令格式如下:

jar xf ImageAudio.jar

在圖2.14中已經看到了ImageAudio.jar文件中的內容,為了方便分析,這里再給出該文件的內容。

mETA-INF/
mETA-INF/MANIFEST.MF
myimages;
myimages/T4.gif
myimages/T10.gif
myimages/T2.gif
myimages/T3.gif
myimages/T2.gif
myaudio/
myaudio/mid_warn.wav
myaudio/mid_info.wav
myaudio/mid_err.wav

假設想從ImageAudio.jar文件中提取T2.gif和mid_warn.wav兩個文件,可以采用如下命令格式:

Jar xf ImgeAudio.jar myimages/T2.gif myaudio/mid_warn.wav

該命令做兩件事:

?復制目錄myimages下的T2.gif和myaudio目錄下的mid_warn.wav文件。

?如果文件夾myimages或myaudio不存在則創建新文件夾,并把文件T2.gif放入myimages文件夾,把mid_warn.wav放入myaudio文件夾。

說明

因為ImageAudio.jar文件是帶目錄結構的,所以在提取文件時必須告訴Jar工具文件的相對位置,否則無法提取想要的文件。無論如何,原始的ImageAudio.jar不會發生任何變化。

讀者可以以相同的方式提取任何類型的文件,當然前提是該文件在jar文件中存在,所以要求讀者在提取文件前先使用命令jar tf jar-file來查看文件內容。

而如果沒有指定要提取的文件名稱,則默認是提取所有的jar文件中的內容,并重建文件目錄。讀者可以通過如下命令體驗該功能:

Jar   xf ImageAudio.jar

2.4.4 更新jar文件

Jar工具提供了u參數向已經存在的jar文件中增加新的文件,其基本命令格式如下所示。

jar uf jar-file.jar input_file(s)

下面分析該命令的參數或選項的含義。

?u選項說明需要更新jar文件的內容列表。

?f選項指明需要更新的jar文件必須在命令行中說明。

?jar-file參數是需要更新的jar文件。

?input_file(s)表示需要增加到jar文件中的文件列表。

說明

如果增加的文件在jar文件中已經存在,則新文件會覆蓋掉原來的文件。

【實例2.4】下面舉例說明如何向已經存在的jar文件中增加新文件。請讀者再回憶一下ImageAudio.jar的內容:

mETA-INF/
mETA-INF/MANIFEST.MF
myimages;
myimages/T4.gif
myimages/T10.gif
myimages/T2.gif
myimages/T3.gif
myimages/T2.gif
myaudio/
myaudio/mid_warn.wav
myaudio/mid_info.wav
myaudio/mid_err.wav

假設想要向該jar文件中增加一個mid_dd.wav文件,首先在mid_dd.wav文件所在目錄下執行如下命令:

Jar uf ImageAudio.jar mid_confirm.wav

再次查看ImageAudio.jar的文件內容則如下所示。

META-INF/
META-INF/MANIFEST.MF
myimages/
myimages/T4.gif
myimages/T10.gif
myimages/T2.gif
myimages/T3.gif
myimages/T2.gif
myaudio/
myaudio/mid_warn.wav
myaudio/mid_info.wav
myaudio/mid_err.wav
mid_confirm.wav

注意

在更新后的jar文件中增加了一個文件,該文件在文件列表的最后一行顯示。文件mid_confirm.wav放在ImageAudio.jar文件目錄結構的根目錄下。

如果想添加的文件在文件夾newaudio中,也可以在該文件夾的直接上級目錄中使用-C選項,指定目錄,然后進入目錄尋找想添加的文件。如下命令所示。

jar uf ImageAudio.jar -C newaudio mid_confirm.wav

該命令的作用是向ImageAudio.jar文件中添加一個音頻文件,Jar工具需要在當前目錄的newaudio目錄下繼續搜索名為mid_confirm.wav的文件。

以上介紹了Jar工具的各種使用方式,這里對Jar工具參數含義做個總結:

jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ...

選項含義:

?-c 創建新的存檔。

?-t 列出存檔內容的列表。

?-x 展開存檔中的命名的(或所有的)文件。?-u 更新已存在的存檔。

?-v 生成詳細輸出到標準輸出上。

?-f 指定存檔文件名。

?-m 包含來自標明文件的標明信息。

?-o 只存儲方式,未用ZIP壓縮格式。

?-M 不產生所有項的清單(manifest)文件。

?-i 為指定的jar文件產生索引信息。

?-C 改變到指定的目錄。

說明

如果一個文件名是一個目錄,它將被遞歸處理。清單(manifest)文件名和存檔文件名都需要被指定,按“m”和“f”標志指定的順序相同。

2.4.5 運行打包的jar軟件

至此,讀者已經學習過了如何創建jar文件,提取jar文件的內容,向jar文件中添加文件,以及查看jar文件的內容。本節將介紹如何運行打包的應用程序,以及jar文件在Applet中的應用。考慮以下兩種情形:

?jar文件包含Applet,該Applet在瀏覽器中運行。

?jar文件包含應用程序,該應用程序通過命令行啟動。

下面依次介紹這兩種jar文件的應用方式。

1. jar文件包含Applet

為了激活Applet,使該Applet可以在瀏覽器中運行,使用Applet標簽來表示在HTML中的Applet程序。如果該Applet與jar文件相關聯,則需要使用Archive參數說明jar文件的相對路徑。一個Applet的例子如下所示。

<applet code = MyJarTest.class
               Width=100 height=100>
</applet>

如果需要的程序被打包成名為MyJarTest.jar的jar文件,則可以通過調用Applet標簽Archive的方式說明調用了一個jar文件,并說明該jar文件的相對目錄。

<applet code = MyJarTest.class
               Archive="MyJarTest.jar"
               Width=100 height=100>
</applet>

參數Archive表示包含類MyJarTest.class的jar文件的相對路徑,本例中該jar文件和html文件在相同的目錄中,如果在讀者的程序中二者的路徑不同,則需要修改jar文件的相對路徑。如果該jar文件在html文件所在目錄的下級目錄myjar目錄中,則該Applet應該做如下修改。

applet code = MyJarTest.class
              Archive="myjar/MyJarTest.jar"
              Width=100 height=100>
</applet>

2. jar文件包含應用程序

首先介紹如何打包應用程序。在前面介紹了如何將各種文件打包然后統一發布,但是對于應用程序來講,這有些區別。在運行打包的jar應用程序前必須確保運行環境,知道該jar文件中的哪個類是程序的入口。

所以,為了說明哪個類是應用程序的入口,必須在該jar文件的manifest文件中增加一個Main-Class頭信息。其格式如下所示。

Main-Class: MainClassName

其中MainClassName是作為應用程序入口的類名。下面通過一個具體的例子說明如何打包可運行的jar應用程序。

例如筆者把MyJarTest類作為應用程序的入口,首先需要創建一個名為Manifest.txt的文本文件,在文件內輸入如下內容:

Main-Class: MyJarTest

注意

在Manifest.txt文本文件內的頭信息必須以回車或換行結束,否則無法解析,在完成了上述文件的設置后,執行如下命令。

jar cfm MyJar.jar Manifest.txt MyJarTest.class myaudio myimages

此時完成了應用程序的打包,該應用程序打包后的jar文件名字是MyJar.jar,并且告知了運行環境應用程序執行的入口。接下來執行如下命令執行該應用程序。

Java -jar MyJar.jar
主站蜘蛛池模板: 湘潭县| 郎溪县| 房产| 城口县| 定西市| 沙田区| 哈尔滨市| 湖北省| 洛宁县| 玉山县| 无锡市| 德安县| 沽源县| 志丹县| 聂荣县| 黎平县| 毕节市| 陇川县| 和平县| 龙泉市| 济南市| 千阳县| 高台县| 利辛县| 西乌| 龙州县| 黄平县| 任丘市| 黄冈市| 芮城县| 万安县| 连城县| 绍兴县| 华阴市| 阿勒泰市| 永新县| 秭归县| 磐石市| 烟台市| 于都县| 嘉祥县|