熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

制作可以執行的 JAR 文件包及 jar 命令詳解

2013-11-15 09:48:29  來源: JSP教程 

  作者: 邊城狂人
  
  常常在網上看到有人詢問如何把 java 程序編譯成 exe 文件通常回答只有兩種一種是
  說制作一個可執行的 JAR 文件包就可以像chm 文檔一樣雙擊運行了而另一種回答則是
  使用 JET 來進行編譯但是 JET 是要用錢買的而且據說 JET 也不是能把所有的 Java 程序
  都編譯成執行文件性能也要打些折扣所以使用制作可執行 JAR 文件包的方法就是最佳選擇
  了何況它還能保持 Java 的跨平台特性先來看看什麼是 JAR 文件包
  
   JAR 文件包
  
    JAR 文件就是 Java Archive File顧名思意它的應用是與 Java 息息相關的是 Java
  的一種文檔格式JAR 文件非常類似 ZIP 文件——准確的說它就是 ZIP 文件所以叫它文件
  包JAR 文件與 ZIP 文件唯一的區別就是在 JAR 文件的內容中包含了一個 META
  INF/MANIFESTMF 文件這個文件是在生成 JAR 文件的時候自動創建的舉個例子如果我們具
  有如下目錄結構的一些文件
  
    ==
    ` test
      ` Testclass
  
    把它壓縮成 ZIP 文件 testzip則這個 ZIP 文件的內部目錄結構為
  
    testzp
    ` 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 下文件名為 jarexe
  Linux 下文件名為 jar它的運行需要用到 JDK 安裝目錄下 lib 目錄中的 toolsjar 文件
  過我們除了安裝 JDK 什麼也不需要做因為 SUM 已經幫我們做好了我們甚至不需要將
  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解開後的目錄結
  構如下
  

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19151.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.