cmd 命令行下 java class生成jar包java
進入dos操做符窗口web
cd進入要打成jar包的class文件全部文件夾目錄windows
jar cvf [生成jar的名稱.jar] [列出class文件] //如有多個,以空隔隔開tomcat
如:網絡
一。操做零散的單個或幾個class文件app
jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.classeclipse
二。把一個文件夾下面的全部class文件打成jar包webapp
jar cvf ibstool.jar * 回車編輯器
生成可執行jar包:ide
編譯的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文件,其內容爲:
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.測試可執行jar包.
用命令:java -jar jarname.jar
4.爲可執行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
網絡引用:
java jar命令
好比您的class包存放路徑爲 d:\com\demo (demo是個目錄,下面含有子文件夾及class文件)
具體操做以下:
一、打開dos窗口,進入demo目錄
cd d:\com\demo
二、執行 jar cvf demo.jar * 回車
三、在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 (在第三行)。這個就是咱們以前寫的那個類,也就是咱們的入口類。也即,
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
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
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中的包說明文件. 下面這個報錯一直出現.
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老是沒有被應用,或者是出錯了。
首先給出一個簡單而標準的例子:
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文件版本號,這行照抄
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這種異常。