天天看點

java打成jar包

java打成jar包

下面是jar指令的幫助說明:

用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...

選項包括:

    -c  建立新的歸檔檔案

    -t  列出歸檔目錄

    -x  解壓縮已歸檔的指定(或所有)檔案

    -u  更新現有的歸檔檔案

    -v  在标準輸出中生成詳細輸出

    -f  指定歸檔檔案名

    -m  包含指定清單檔案中的清單資訊

    -e  為捆綁到可執行 jar 檔案的獨立應用程式

        指定應用程式入口點

    -0  僅存儲;不使用任何 ZIP 壓縮

    -M  不建立條目的清單檔案

    -i  為指定的 jar 檔案生成索引資訊

    -C  更改為指定的目錄并包含其中的檔案

如果有任何目錄檔案,則對其進行遞歸處理。

清單檔案名、歸檔檔案名和入口點名的指定順序

與 "m"、"f" 和 "e" 标志的指定順序相同。

示例 1:将兩個類檔案歸檔到一個名為 classes.jar 的歸檔檔案中:

       jar cvf classes.jar Foo.class Bar.class

示例 2:使用現有的清單檔案 "mymanifest" 并

           将 foo/ 目錄中的所有檔案歸檔到 "classes.jar" 中:

       jar cvfm classes.jar mymanifest -C foo/ .

下文假設編譯後的class檔案在bin目錄下

一、打包成一般的jar包(非可執行jar包)

eg1:進入指定目錄并将該目錄下的所有檔案打包:

[[email protected] bin] pwd

/home/zhu/workspace/hadoop/bin

jar cvf wordcount.jar . 或 jar cvf wordcount.jar ./ 或 jar cvf wordcount.jar ./*

以上三個指令都一樣,"."表示将目前目錄(/home/zhu/workspace/hadoop/bin)下的所有檔案打成jar包,生成的wordcount.jar包在目前的操作目錄(/home/zhu/workspace/hadoop/bin)

eg2.在任意目錄打包非目前目錄(即不是你所在的任意目錄)下的檔案:

[[email protected]zhu]  pwd

/home/zhu

jar cvf wordcount.jar -C /home/zhu/workspace/hadoop/bin .(或”./“或”./*“)

注意:

1.”.“表示将/home/zhu/workspace/hadoop/bin目錄下的所有檔案打包,注意”.“不能寫錯,如果寫成了”../“則表示将bin目錄的上級目錄及/home/zhu/workspace/hadoop目錄下的所有檔案打包,如果這樣子的話,最後生成的jar包的包路徑就多了一個bin,如bin/org/zhu/hadoop/WordCount.class,正确的應是org/zhu/hadoop/WordCount.class。

2.上述操作生成的wordcount.jar檔案在目前操作目錄下(/home/zhu),而不是在/home/zhu/workspace/hadoop/bin下,也即是說你在什麼路徑下執行jar指令最後生成的jar包就在什麼路徑。

二、打包成可運作的jar包

要打包成可運作的jar包,有三種方法:

一是手動建立MANIFEST.MF檔案,并在其中指定主類,然後執行jar cvfm xxxx.jar MANIFEST.MF(注意該檔案的路徑) (-C class路徑 ). ;

二是使用jar的-e參數指定可運作jar包的入口點(即main類的完全名稱),即指令jar cvfe xxx.jar 主類全名稱 (-C bin/) .

三是先使用上文中"一、打包成一般的jar包(非可執行jar包)"中的方法打包成一般的jar包,然後用壓縮工具打開META-INF/MANIFEST.MF檔案,并修改其内容,加上Class-Path和Main-Class參數值。

eg:建立一個工程,結構如下,在Print.java程式中列印"hello word"

java打成jar包

[[email protected] Test]$ cd ~/workspace/Test

pwd:

/home/zhu/workspace/Test

[[email protected] Test]$ ls :

bin  src

1.方法一:手動建立MANIFEST.MF檔案并執行jar cvfm指令打包:

(1).建立MANIFEST.MF檔案并編輯:

[[email protected] Test]$ touch MANIFEST.MF

MANIFEST.MF内容如下:

  1. Manifest-Version: 1.0  
  2. Created-By: zhuxun
  3. Class-Path: .   
  4. Main-Class: hello.Print

注:主類名必須把包路徑也加上(即填寫完整的類路徑)

說明:

  第一行指定清單的版本,若無,則JDK預設生成:Manifest-Version: 1.0

  第二行指明建立的作者,若無,則JDK預設生成Created-By: 1.6.0_22(Sun Microsystems Inc.)

  第三行指定主類所在類路徑,

  第四行指明程式運作的主類

(2).執行jar cvfm指令:

[[email protected] Test]$ jar cvfm hello.jar MANIFEST.MF -C bin/ .

 說明:

  參數f:指定打包後的包名。

  參數m:指定自定義的MANIFEST.MF清單檔案,否則,JDK會自動生成不包含Main-Class的預設清單。

  參數c:指定是建立新的歸檔檔案。

  參數v:在标準輸出中生成詳細輸出,該選項是可選的。

這時會在目前目錄(/home/zhu/workspace/Test)下生成hello.jar

解壓hello.jar并檢視META-INF/MANIFEST.MF檔案,内容如下:

Manifest-Version: 1.0  

Created-By: zhuxun

Class-Path: .   

Main-Class: hello.Print

運作hello.jar:

[[email protected] Test]$java -jar hello.jar

hello world

2.方法二:使用jar的-e參數指定可運作jar包的入口點(即執行jar cvfe指令指定主類):

[[email protected] Test]$ jar cvfe hello.jar hello.Print -C bin/ .

注:主類名必須把包路徑也加上(即填寫完整的類路徑)

說明:

這時會在目前目錄(/home/zhu/workspace/Test)下生成hello.jar

解壓hello.jar并檢視META-INF/MANIFEST.MF檔案,内容如下:

Manifest-Version: 1.0  

Created-By: zhuxun

Main-Class: hello.Print

注:此種方式生成的MANIFEST.MF檔案中沒有Class-Path參數

[[email protected] Test]$ java -jar hello.jar

hello world

3. 方法三:先使用上文中"一、打包成一般的jar包(非可執行jar包)"中的方法打包成一般的jar包,然後用壓縮工具打開META-INF/MANIFEST.MF檔案,并修改其内容,加上Class-Path和Main-Class參數值,參考如下: Class-Path: .   

Main-Class: hello.Print

注:此 種方法有點太麻煩了,不推薦使用。

另外可以使用Eclipse的Export功能完成打包:

一、打包成一般的jar包:

步驟如下:

  1)在要打包的項目上右擊,選擇Export

  2)在彈出的視窗中,選擇Java -> JAR File,然後點選next按鈕

  3)在JAR File Specification視窗中,設定打包成的檔案名和存放位置,點選兩側next

  4)在JAR Manifest Specification視窗中,設定MANIFEST.MF清單檔案的配置,

    若僅僅打包成單純的jar包的話,不用做任何修改,采取預設即可

    若打包成可執行jar包的話,可以使用已存在的MANIFEST檔案或者直接選擇Main class

  5)點選Finish按鈕,完成打包。

二、打包成可運作的jar包

步驟如下:

  1)在要打包的項目上右擊,選擇Export

  2)在彈出的視窗中,選擇Java -> Runnable JAR File,然後點選next按鈕

  3)在Runnable JAR File Specification視窗中,選擇Launch configuration和Export destination

  4)點選Finish按鈕,打包完成。