天天看點

java class生成jar包(轉)

進入dos操作符視窗

cd進入要打成jar包的class檔案所有檔案夾目錄

jar cvf [生成jar的名稱.jar] [列出class檔案] //若有多個,以空隔隔開

如:

一、操作零散的單個或幾個class檔案

jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class

二、把一個檔案夾下面的所有class檔案打成jar包

jar cvf ibstool.jar * 回車

生成可執行jar包:

編譯的class檔案中必須有main入口函數的類方能生成可執行jar包,如:

public static void main(String[] args)

生成的方法步驟:

方法一:

1、用上面的方法把class與相應的結構目錄打成jar包

2、解壓這個jar包到目前目錄

3、編輯META-INF/MANIFEST.MF,給jar包指定程式入口main函數,内容為:

Manifest-Version: 1.0

Created-By: 1.5.0_06 (Sun Microsystems Inc.)

Main-Class: MutiThread (回車)

(注意回車與空格,這個檔案的内容排版必須标準)

4、再用winzip把這些檔案壓縮成jar格式包,或者壓成zip包,再改字尾名為jar也可。

方法二(推薦):

2. 打成可執行的jar包

cmd操作窗體中進入class檔案的根目錄,之是以說根目錄,是因為下面其下面還可以有很多檔案包(夾);

在此目錄準備好一個manifest.mf檔案,其内容為:

Main-Class: MainEntry

main-class為指定所有類的main方法所在的類名.

最後用指令: jar cvfm jarname.jar manifest.mf *

3.測試可執行jar包.

用指令:java -jar jarname.jar

4.為可執行jar包制作bat檔案.

例如 :

@echo off

rem

rem Set BQ_IBS_HOME before running this script.

if not "%BQ_IBS_HOME%" == "" goto CONT0

set BQ_IBS_HOME=c:\ibs

:CONT0

@echo on

java -DBQ_IBS_HOME=%BQ_IBS_HOME% -jar jarname.jar

:END

網絡引用:

java jar指令

比如您的class包存放路徑為 d:\com\demo (demo是個目錄,下面含有子檔案夾及class檔案)

具體操作如下:

1、打開dos視窗,進入demo目錄

cd d:\com\demo

2、執行 jar cvf demo.jar * 回車

3、在demo目錄下面你會發現demo.jar

具體參數請看下面的解釋:

用法:jar {ctxu}[vfm0Mi] [jar-檔案] [manifest-檔案] [-C 目錄] 檔案名 ...

選項:

-c 建立新的存檔

-t 列出存檔内容的清單

-x 展開存檔中的命名的(或所有的〕檔案

-u 更新已存在的存檔

-v 生成詳細輸出到标準輸出上

-f 指定存檔檔案名

-m 包含來自标明檔案的标明資訊

-0 隻存儲方式;未用zip壓縮格式

-M 不産生所有項的清單(manifest〕檔案

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

-C 改變到指定的目錄,并且包含下列檔案:

如果一個檔案名是一個目錄,它将被遞歸處理。

清單(manifest〕檔案名和存檔檔案名都需要被指定,按'm' 和 'f'标志指定的相同順序。

示例1:将兩個class檔案存檔到一個名為 'classes.jar' 的存檔檔案中:

jar cvf classes.jar Foo.class Bar.class

示例2:用一個存在的清單(manifest)檔案 'mymanifest' 将 foo/ 目錄下的所有檔案存檔到一個名為 'classes.jar' 的存檔檔案中:

jar cvfm classes.jar mymanifest -C foo/ .

來個小例子試試看:

我們隻有一個HelloWorld,如下:

public class HelloWorld{

public static void main(String[ ] args){

System.out.println(“Hi, Hello World!”);

}

将這個java檔案存到C槽跟目錄下,ok,接下來,

在先前打開的指令提示符下(跳轉到C槽提示符下),我們輸入javac HelloWorld.java,然後繼續輸入:jar cvf hello.jar HelloWorld.class,回車後去你的C槽看看,多了什麼,沒錯 hello.jar 。

基本的步驟我們現在都知道了,你可以自己去嘗試一下随着jar後面的參數的不同,結果有什麼變化。

緊接着我們看看如何運作我們的jar包。

在進入正題之前,你要先打開我們剛剛做好的jar包看看,多了什麼呢,META-INF目錄?再看看裡面是什麼,還有一個MANIFEST.MF檔案是不是?用文本編輯器(我這裡是UltraEdit)打開它看看:

Manifest-Version: 1.0

Created-By: 1.4.2 (Sun Microsystems Inc.)

就是這樣。這裡我們對它進行修改,加一句:Main-Class: HelloWorld (在第三行)。這個就是我們之前寫的那個類,也就是我們的入口類。也即,

Main-Class: HelloWorld

接下來,我們在指令提示符裡執行:

jar umf MANIFEST.MF app.jar (應該是hello.jar吧)

這樣我們使用了我們自己的MANIFEST.MF檔案對原來預設的進行了更新。你不妨可以再進去看看是不是添上了Main-Class: HelloWorld這一句。 (是嗎,我怎麼沒試出來,提示java.io.FileNotFoundException:MANIFEST.MF(系統找不到指定的檔案)怎麼回事?)

Ok,這個最後的一步了,來驗證我們做的一切,在指令提示符中輸入:

java -jar hello.jar(執行)

出現了什麼, Hi, Hello World!

我們再來看看jar檔案在tomcat中釋出,注意:在tomcat中我們就不能再用jar這種格式,而改war格式,它是專門用于web應用的,其實整個過程下來基本上和jar是類似的:

先準備我們要打包的資源。

找到存放tomcat的webapps目錄,進到其中,建立一個檔案夾,這裡命名為hello,再進去建立WEB-INF檔案夾,再進去建立classes檔案夾,此時我們也将我們唯一的servlet,HelloWorld.java放到這裡,在與classes目錄同級下建立一檔案web.xml。Ok,目前我們初步建立了一個簡單的web應用。

關于 MANIFEST.MF 寫法.

例如我們打包的jar為 Test.jar

Main-Class: windows.VideoWindow

Class-Path: lib\org.eclipse.swt_3.3.0.v3346.jar lib\org.eclipse.swt.win32.win32.x86_3.3.0.v3346.jar

上面為打包為jar中的包說明檔案. 下面這個報錯一直出現.

could not find main class. Program will exit

這個錯誤提示其實不是沒有發現main class. 而是jar如果有錯誤執行不了,就會出現這個錯誤. 打包完成後, 要先運作 cmd -> java -jar your.jar 确認沒有問題即可執行jar. 使用-jar參數後, 系統的Classpath 變量不再起作用. 虛拟機将去MANIFEST.MF中的Class-Path 下找相關的包.

然後才能成功的從: windows.VideoWindow 的main方法進入. 否則沒有相關連接配接包,則會提示找不到main class. 而大家可能還迷糊的找不到北. 明明有main class嗎.

如果這個寫的不對. 則就會一直報錯.

看看上面這個Class-Path: 後面的寫法. 空格分開. 絕對不能有分号.切記.

最後必須有換行. 這個也是要注意的. 否則依然提示沒有mainclass.

不要因為這個小事情耽誤了時間. 其中 lib/ 表示這個jar必須在打包Test.jar所在目錄的一個lib子目錄中.

運作jar需要指令: java -jar Test.jar

輕按兩下也可以, 則使用 javaw 打開.

關于java -classpath a.jar;b.jar; class test.Test 執行時. a.jar;b.jar; 後面都必須有分号. 否則報錯. 不要指望不寫classpath讓系統自己找. 這不是在eclipse裡面.必須寫上你要使用的類. 否則總會提示您編譯出錯.

可以用的上的有:

1. Main-Class 指定程式的入口,這樣可以直接用java -jar xxx.jar來運作程式。

2. Class-Path 指定jar包的依賴關系,class loader會依據這個路徑來搜尋class。

我平時用mf檔案一般說來都是讓jar成為可以直接運作這一目的。雖然目的這麼簡單,但是每次打包還是很容易出現各種各樣的問題讓人頭痛。mf總是沒有被應用,或者是出錯了。

首先給出一個簡單而标準的例子:

Main-Class: ui.JFrameMain

Class-Path: jtds-1.2.jar c3p0-0.9.1.2.jar

esri_mo20.jar esri_mo20res.jar jsde83_sdk.jar

解釋一下:

Manifest-Version mf檔案版本号,這行照抄

Main-Class 包含main函數的類,程式的入口

Class-Path 用到的一些包

分析一下要點:

要點1:每行的“:”(冒号)用來分隔鍵值對。冒号後邊一定要跟一個空格!!!

也就是說務必寫為:

Main-Class:(空格)YouClassName

Class-Path:(空格)Class1.Jar

否則JBuilder會報("Manifest.mf": Error reading manifest: java.io.IOException: invalid header field

)這樣的錯。不再IDE幫助下做的JAR會發現MF沒有起到應有的作用。順便說一下以前我看到JBuilder報另一個個錯大概說是什麼換行符不對,好像也是由于這個問題引發的。原先總以為是windows裡邊的回車是由回車,換行2個字元構成而造成的。現在看來好像不是這樣,是因為少了冒号後邊那個空格。

要點2:Class-Path裡邊的内容用空格分隔而不是逗号或者分号。(唉。。。我總是下意識的用分号)

也就是說務必寫成:

Class-Path:(空格)Class1.jar(空格)Class2.jar(空格)Class3.Jar

要點3:有的文章說MF檔案每行不能超過七十多的字元,我的經驗是如果在JBuilder裡編輯MF超過了也無妨,一般我是盡量一行寫完。續行挺麻煩又要以空格開頭什麼的。我也經常直接用winRar打開jar然後直接編輯裡邊的mf檔案,這是個好方法,很直接了當,缺點就是如果改壞了也不會報錯,隻是MF有的部分失效了,好像運作時也會說"錯誤的MF檔案版本"。

介紹幾個技巧:

技巧1:使用winRar打開jar,輕按兩下MF檔案,就可以編輯了,編輯完了Ctrl+S儲存。特友善。也可以在外邊寫好一個Manifest.mf,然後直接拖入覆寫以前的。

技巧2:寫一個run.bat來運作你的jar。run.bat大體内容如下:

java -jar yours.jar

pause

後邊加一個pause就可以讓你看到具體哪裡出錯了,一般來說問題如果出在MF上,那麼往往就是哪個包,哪個類沒有找到的NoClassDef這種異常。