進入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這種異常。