熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Jar文件包間接及Jar命令開發實例詳解

2013-11-23 19:18:36  來源: Java核心技術 

  常常看到有人詢問如何把Java程序編譯成exe文件通常回答只有兩種一種是制作一個可執行的JAR文件包然後就可以像chm文檔一樣雙擊運行了而另一種是使用JET來進行編譯
  
  但是 JET 是要用錢買的而且據說 JET 也不是能把所有的 Java 程序都編譯成執行文件性能也要打些折扣所以使用制作可執行 JAR 文件包的方法就是最佳選擇了何況它還能保持 Java 的跨平台特性下面就來看看什麼是 JAR 文件包吧
  
  JAR 文件包
  
  JAR 文件就是 Java Archive File顧名思意它的應用是與 Java 息息相關的是 Java 的一種文檔格式JAR 文件非常類似 ZIP 文件准確的說它就是 ZIP 文件所以叫它文件包JAR 文件與 ZIP 文件唯一的區別就是在 JAR 文件的內容中包含了一個 METAINF/MANIFESTMF 文件這個文件是在生成 JAR 文件的時候自動創建的舉個例子如果我們具有如下目錄結構的一些文件
  
  ==
  
  ` test
  
  ` Testclass
  
  把它壓縮成 ZIP 文件 testzip則這個 ZIP 文件的內部目錄結構為
  
  testzip
  
  ` test
  
  ` Testclass
  
  如果我們使用 JDK 的 jar 命令把它打成 JAR 文件包 testjar則這個 JAR 文件的內部目錄結構為
  
  testjar
  
  | METAINF
  
  |  ` MANIFESTMF
  
  ` test
  
  `Testclass
  
  創建可執行的 JAR 文件包
  
  制作一個可執行的 JAR 文件包來發布你的程序是 JAR 文件包最典型的用法
  
  Java 程序是由若干個 class 文件組成的這些 class 文件必須根據它們所屬的包不同而分級分目錄存放運行前需要把所有用到的包的根目錄指定給 CLASSPATH 環境變量或者 java 命令的 cp 參數運行時還要到控制台下去使用 java 命令來運行如果需要直接雙擊運行必須寫 Windows 的批處理文件 (bat) 或者 Linux 的 Shell 程序因此許多人說Java 是一種方便開發者苦了用戶的程序設計語言
  
  其實不然如果開發者能夠制作一個可執行的 JAR 文件包交給用戶那麼用戶使用起來就方便了在 Windows 下安裝 JRE (Java Runtime Environment) 的時候安裝文件會將 jar 文件映射給 javawexe 打開
  
  那麼對於一個可執行的 JAR 文件包用戶只需要雙擊它就可以運行程序了和閱讀 chm 文檔一樣方便 (chm 文檔默認是由 hhexe 打開的)那麼現在的關鍵就是如何來創建這個可執行的 JAR 文件包
  
  創建可執行的 JAR 文件包需要使用帶 cvfm 參數的 jar 命令同樣以上述 test 目錄為例命令如下
  
  jar cvfm testjar manifestmf test
  
  這裡 testjar 和 manifestmf 兩個文件分別是對應的參數 f 和 m其重頭戲在 manifestmf因為要創建可執行的 JAR 文件包光靠指定一個 manifestmf 文件是不夠的因為 MANIFEST 是 JAR 文件包的特征可執行的 JAR 文件包和不可執行的 JAR 文件包都包含 MANIFEST關鍵在於可執行 JAR 文件包的 MANIFEST其內容包含了 MainClass 一項這在 MANIFEST 中書寫格式如下
  
  MainClass: 可執行主類全名(包含包名)
  
  例如假設上例中的 Testclass 是屬於 test 包的而且是可執行的類 (定義了 public static void main(String[]) 方法)那麼這個 manifestmf 可以編輯如下
  
  MainClass: testTest <回車>
  
  這個 manifestmf 可以放在任何位置也可以是其它的文件名只需要有 MainClass: testTest 一行且該行以一個回車符結束即可創建了 manifestmf 文件之後我們的目錄結構變為
  
  ==
  
  | test
  
  |  ` Testclass
  
  ` manifestmf
  
  這時候需要到 test 目錄的上級目錄中去使用 jar 命令來創建 JAR 文件包也就是在目錄樹中使用==表示的那個目錄中使用如下命令
  
  jar cvfm testjar manifestmf test
  
  之後在==目錄中創建了 testjar這個 testjar 就是執行的 JAR 文件包運行時只需要使用 java jar testjar 命令即可
  
  需要注意的是創建的 JAR 文件包中需要包含完整的與 Java 程序的包結構對應的目錄結構就像上例一樣而 MainClass 指定的類也必須是完整的包含包路徑的類名如上例的 testTest而且在沒有打成 JAR 文件包之前可以使用 java <類名> 來運行這個類即在上例中 java testTest 是可以正確運行的 (當然要在 CLASSPATH 正確的情況下)
  
  jar 命令詳解
  
  jar 是隨 JDK 安裝的在 JDK 安裝目錄下的 bin 目錄中Windows 下文件名為 jarexeLinux 下文件名為 jar它的運行需要用到 JDK 安裝目錄下 lib 目錄中的 toolsjar 文件不過我們除了安裝 JDK 什麼也不需要做因為 SUN 已經幫我們做好了我們甚至不需要將 toolsjar 放到 CLASSPATH 中
  
  使用不帶任何的 jar 命令我們可以看到 jar 命令的用法如下
  
  jar {ctxu}[vfmM] [jar文件]
  
  [manifest文件] [C 目錄] 文件名
  
  其中 {ctxu} 是 jar 命令的子命令每次 jar 命令只能包含 ctxu 中的一個它們分別表示
  
  c 創建新的 JAR 文件包
  
  t 列出 JAR 文件包的內容列表
  
  x 展開 JAR 文件包的指定文件或者所有文件
  
  u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)
  
  [vfmM] 中的選項可以任選也可以不選它們是 jar 命令的選項參數
  
  v 生成詳細報告並打印到標准輸出
  
  f 指定 JAR 文件名通常這個參數是必須的
  
  m 指定需要包含的 MANIFEST 清單文件
  
   只存儲不壓縮這樣產生的 JAR 文件包會比不用該參數產生的體積大
  
  但速度更快
  
  M 不產生所有項的清單(MANIFEST〕文件此參數會忽略 m 參數
  
  [jar文件] 即需要生成查看更新或者解開的 JAR 文件包
  
  它是 f 參數的附屬參數
  
  [manifest文件] 即 MANIFEST 清單文件它是 m 參數的附屬參數
  
  [C 目錄] 表示轉到指定目錄下去執行這個 jar 命令的操作它相當於先使用 cd
  
  命令轉該目錄下再執行不帶 C 參數的 jar 命令它只能在創建和更新 JAR
  
  文件包的時候可用
  
  文件名 指定一個文件/目錄列表這些文件/目錄就是要添加到 JAR 文件包中的文件/目錄如果指定了目錄那麼 jar 命令打包的時候會自動把該目錄中的所有文件和子目錄打入包中 下面舉一些例子來說明 jar 命令的用法
  
  ) jar cf testjar test
  
  該命令沒有執行過程的顯示執行結果是在當前目錄生成了 testjar 文件如果當前目錄已經存在 testjar那麼該文件將被覆蓋
  
  ) jar cvf testjar test
  
  該命令與上例中的結果相同但是由於 v 參數的作用顯示出了打包過程如下
  
  標明清單(manifest)
  
  增加test/(讀入= )
  
  (寫出= )(存儲了 %)
  
  增加test/Testclass(讀入= )
  
  (寫出= )(壓縮了 %)
  
  ) jar cvfM testjar test
  
  該命令與 ) 結果類似但在生成的 testjar 中沒有包含 METAINF/MANIFEST 文件打包過程的信息也略有差別
  
  增加test/(讀入= )
  
  (寫出= )(存儲了 %)
  
  增加test/Testclass(讀入= )
  
  (寫出= )(壓縮了 %)
  
  ) jar cvfm testjar manifestmf test
  
  運行結果與 ) 相似顯示信息也相同只是生成 JAR 包中的 METAINF/MANIFEST 內容不同是包含了 manifestmf 的內容
  
  ) jar tf testjar
  
  在 testjar 已經存在的情況下可以查看 testjar 中的內容如對於 ) 和 ) 生成的 testjar 分別應該此命令結果如下
  
  對於 )
  
  METAINF/
  
  METAINF/MANIFESTMF
  
  test/
  
  test/Testclass
  
  對於 )
  
  test/
  
  test/Testclass
  
  ) jar tvf testjar
  
  除顯示 ) 中顯示的內容外還包括包內文件的詳細信息
  
   Wed Jun :: GMT METAINF/
  
   Wed Jun :: GMT METAINF/MANIFESTMF
  
   Wed Jun :: GMT test/
  
   Wed Jun :: GMT test/Testclass
  
  ) jar xf testjar
  
  解開 testjar 到當前目錄不顯示任何信息對於 ) 生成的 testjar解開後的目錄結構如下
  
  ==
  
  | METAINF
  
  |  ` MANIFEST
  
  ` test
  
  `Testclass
  
  jar xvf testjar
  
  運行結果與 ) 相同對於解壓過程有詳細信息顯示
  
  創建METAINF/
  
  展開METAINF/MANIFESTMF
  
  創建test/
  
  展開test/Test
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26631.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.