進(jìn)入dos操作符窗口 cd進(jìn)入要打成jar包的class文件所有文件夾目錄 jar cvf [生成jar的名稱.jar] [列出class文件] //若有多個(gè),以空隔隔開 如: 一。操作零散的單個(gè)或幾個(gè)class文件 jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class 二。把一個(gè)文件夾下面的所有class文件打成jar包 jar cvf ibstool.jar * 回車 生成可執(zhí)行jar包: 編譯的class文件中必須有main入口函數(shù)的類方能生成可執(zhí)行jar包,如: public static void main(String[] args) 生成的方法步驟: 方法一: 1。用上面的方法把class與相應(yīng)的結(jié)構(gòu)目錄打成jar包 2。解壓這個(gè)jar包到當(dāng)前目錄 3。編輯META-INF/MANIFEST.MF,給jar包指定程序入口main函數(shù),內(nèi)容為: Manifest-Version: 1.0 Created-By: 1.5.0_06 (Sun Microsystems Inc.) Main-Class: MutiThread (回車) (注意回車與空格,這個(gè)文件的內(nèi)容排版必須標(biāo)準(zhǔn)) 4。再用winzip把這些文件壓縮成jar格式包,或者壓成zip包,再改后綴名為jar也可。 方法二(推薦): 2. 打成可執(zhí)行的jar包 cmd操作窗體中進(jìn)入class文件的根目錄,之所以說根目錄,是因?yàn)橄旅嫫湎旅孢€可以有很多文件包(夾); 在此目錄準(zhǔn)備好一個(gè)manifest.mf文件,其內(nèi)容為: Manifest-Version: 1.0 Created-By: 1.5.0_06 (Sun Microsystems Inc.) Main-Class: MainEntry main-class為指定所有類的main方法所在的類名. 最后用命令: jar cvfm jarname.jar manifest.mf * 3.測(cè)試可執(zhí)行jar包. 用命令:java -jar jarname.jar 4.為可執(zhí)行jar包制作bat文件. 例如 : @echo off rem rem Set BQ_IBS_HOME before running this script. rem 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 網(wǎng)絡(luò)引用: java jar命令 比如您的class包存放路徑為 d:\com\demo (demo是個(gè)目錄,下面含有子文件夾及class文件) 具體操作如下: 1、打開dos窗口,進(jìn)入demo目錄 cd d:\com\demo 2、執(zhí)行 jar cvf demo.jar * 回車 3、在demo目錄下面你會(huì)發(fā)現(xiàn)demo.jar 具體參數(shù)請(qǐng)看下面的解釋: 用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ... 選項(xiàng): -c 創(chuàng)建新的存檔 -t 列出存檔內(nèi)容的列表 -x 展開存檔中的命名的(或所有的〕文件 -u 更新已存在的存檔 -v 生成詳細(xì)輸出到標(biāo)準(zhǔn)輸出上 -f 指定存檔文件名 -m 包含來自標(biāo)明文件的標(biāo)明信息 -0 只存儲(chǔ)方式;未用zip壓縮格式 -M 不產(chǎn)生所有項(xiàng)的清單(manifest〕文件 -i 為指定的jar文件產(chǎn)生索引信息 -C 改變到指定的目錄,并且包含下列文件: 如果一個(gè)文件名是一個(gè)目錄,它將被遞歸處理。 清單(manifest〕文件名和存檔文件名都需要被指定,按'm' 和 'f'標(biāo)志指定的相同順序。 示例1:將兩個(gè)class文件存檔到一個(gè)名為 'classes.jar' 的存檔文件中: jar cvf classes.jar Foo.class Bar.class 示例2:用一個(gè)存在的清單(manifest)文件 'mymanifest' 將 foo/ 目錄下的所有文件存檔到一個(gè)名為 'classes.jar' 的存檔文件中: jar cvfm classes.jar mymanifest -C foo/ . 來個(gè)小例子試試看: 我們只有一個(gè)HelloWorld,如下: public class HelloWorld{ public static void main(String[ ] args){ System.out.println(“Hi, Hello World!”); } } 將這個(gè)java文件存到C盤跟目錄下,ok,接下來, 在先前打開的命令提示符下(跳轉(zhuǎn)到C盤提示符下),我們輸入javac HelloWorld.java,然后繼續(xù)輸入:jar cvf hello.jar HelloWorld.class,回車后去你的C盤看看,多了什么,沒錯(cuò) hello.jar 。 基本的步驟我們現(xiàn)在都知道了,你可以自己去嘗試一下隨著jar后面的參數(shù)的不同,結(jié)果有什么變化。 緊接著我們看看如何運(yùn)行我們的jar包。 在進(jìn)入正題之前,你要先打開我們剛剛做好的jar包看看,多了什么呢,META-INF目錄?再看看里面是什么,還有一個(gè)MANIFEST.MF文件是不是?用文本編輯器(我這里是UltraEdit)打開它看看: Manifest-Version: 1.0 Created-By: 1.4.2 (Sun Microsystems Inc.) 就是這樣。這里我們對(duì)它進(jìn)行修改,加一句:Main-Class: HelloWorld (在第三行)。這個(gè)就是我們之前寫的那個(gè)類,也就是我們的入口類。也即, Manifest-Version: 1.0 Created-By: 1.4.2 (Sun Microsystems Inc.) Main-Class: HelloWorld 接下來,我們?cè)诿钐崾痉飯?zhí)行: jar umf MANIFEST.MF app.jar (應(yīng)該是hello.jar吧) 這樣我們使用了我們自己的MANIFEST.MF文件對(duì)原來默認(rèn)的進(jìn)行了更新。你不妨可以再進(jìn)去看看是不是添上了Main-Class: HelloWorld這一句。 (是嗎,我怎么沒試出來,提示java.io.FileNotFoundException:MANIFEST.MF(系統(tǒng)找不到指定的文件)怎么回事?) Ok,這個(gè)最后的一步了,來驗(yàn)證我們做的一切,在命令提示符中輸入: java -jar hello.jar(執(zhí)行) 出現(xiàn)了什么, Hi, Hello World! 我們?cè)賮砜纯磈ar文件在tomcat中發(fā)布,注意:在tomcat中我們就不能再用jar這種格式,而改war格式,它是專門用于web應(yīng)用的,其實(shí)整個(gè)過程下來基本上和jar是類似的: 先準(zhǔn)備我們要打包的資源。 找到存放tomcat的webapps目錄,進(jìn)到其中,新建一個(gè)文件夾,這里命名為hello,再進(jìn)去新建WEB-INF文件夾,再進(jìn)去新建classes文件夾,此時(shí)我們也將我們唯一的servlet,HelloWorld.java放到這里,在與classes目錄同級(jí)下建立一文件web.xml。Ok,目前我們初步建立了一個(gè)簡(jiǎn)單的web應(yīng)用。 關(guān)于 MANIFEST.MF 寫法. 例如我們打包的jar為 Test.jar Manifest-Version: 1.0 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中的包說明文件. 下面這個(gè)報(bào)錯(cuò)一直出現(xiàn). could not find main class. Program will exit 這個(gè)錯(cuò)誤提示其實(shí)不是沒有發(fā)現(xiàn)main class. 而是jar如果有錯(cuò)誤執(zhí)行不了,就會(huì)出現(xiàn)這個(gè)錯(cuò)誤. 打包完成后, 要先運(yùn)行 cmd -> java -jar your.jar 確認(rèn)沒有問題即可執(zhí)行jar. 使用-jar參數(shù)后, 系統(tǒng)的Classpath 變量不再起作用. 虛擬機(jī)將去MANIFEST.MF中的Class-Path 下找相關(guān)的包. 然后才能成功的從: windows.VideoWindow 的main方法進(jìn)入. 否則沒有相關(guān)連接包,則會(huì)提示找不到main class. 而大家可能還迷糊的找不到北. 明明有main class嗎. 如果這個(gè)寫的不對(duì). 則就會(huì)一直報(bào)錯(cuò). 看看上面這個(gè)Class-Path: 后面的寫法. 空格分開. 絕對(duì)不能有分號(hào).切記. 最后必須有換行. 這個(gè)也是要注意的. 否則依然提示沒有mainclass. 不要因?yàn)檫@個(gè)小事情耽誤了時(shí)間. 其中 lib/ 表示這個(gè)jar必須在打包Test.jar所在目錄的一個(gè)lib子目錄中. 運(yùn)行jar需要命令: java -jar Test.jar 雙擊也可以, 則使用 javaw 打開. 關(guān)于java -classpath a.jar;b.jar; class test.Test 執(zhí)行時(shí). a.jar;b.jar; 后面都必須有分號(hào). 否則報(bào)錯(cuò). 不要指望不寫classpath讓系統(tǒng)自己找. 這不是在eclipse里面.必須寫上你要使用的類. 否則總會(huì)提示您編譯出錯(cuò). 可以用的上的有: 1. Main-Class 指定程序的入口,這樣可以直接用java -jar xxx.jar來運(yùn)行程序。 2. Class-Path 指定jar包的依賴關(guān)系,class loader會(huì)依據(jù)這個(gè)路徑來搜索class。 我平時(shí)用mf文件一般說來都是讓jar成為可以直接運(yùn)行這一目的。雖然目的這么簡(jiǎn)單,但是每次打包還是很容易出現(xiàn)各種各樣的問題讓人頭痛。mf總是沒有被應(yīng)用,或者是出錯(cuò)了。 首先給出一個(gè)簡(jiǎn)單而標(biāo)準(zhǔn)的例子: Manifest-Version: 1.0 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文件版本號(hào),這行照抄 Main-Class 包含main函數(shù)的類,程序的入口 Class-Path 用到的一些包 分析一下要點(diǎn): 要點(diǎn)1:每行的“:”(冒號(hào))用來分隔鍵值對(duì)。冒號(hào)后邊一定要跟一個(gè)空格?。?! 也就是說務(wù)必寫為:
)這樣的錯(cuò)。不再IDE幫助下做的JAR會(huì)發(fā)現(xiàn)MF沒有起到應(yīng)有的作用。順便說一下以前我看到JBuilder報(bào)另一個(gè)個(gè)錯(cuò)大概說是什么換行符不對(duì),好像也是由于這個(gè)問題引發(fā)的。原先總以為是windows里邊的回車是由回車,換行2個(gè)字符構(gòu)成而造成的?,F(xiàn)在看來好像不是這樣,是因?yàn)樯倭嗣疤?hào)后邊那個(gè)空格。 要點(diǎn)2:Class-Path里邊的內(nèi)容用空格分隔而不是逗號(hào)或者分號(hào)。(唉。。。我總是下意識(shí)的用分號(hào)) 也就是說務(wù)必寫成:
介紹幾個(gè)技巧: 技巧1:使用winRar打開jar,雙擊MF文件,就可以編輯了,編輯完了Ctrl+S保存。特方便。也可以在外邊寫好一個(gè)Manifest.mf,然后直接拖入覆蓋以前的。 技巧2:寫一個(gè)run.bat來運(yùn)行你的jar。run.bat大體內(nèi)容如下: java -jar yours.jar pause 后邊加一個(gè)pause就可以讓你看到具體哪里出錯(cuò)了,一般來說問題如果出在MF上,那么往往就是哪個(gè)包,哪個(gè)類沒有找到的NoClassDef這種異 |
|