java之生成jar包

高傑才_Android發表於2014-09-28

Java編寫的application程式是否能夠最終形成一個類似於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 正確的情況下)。

相關文章