cmd 命令行下 java class生成jar包

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

相關文章
相關標籤/搜索