Javajar命令常見用法

Java jar命令 常見用法

一、jar命令作用:

 進行打包 -- 把多個文件打包成一個壓縮包 -- 這個壓縮包和Winzip的壓縮格式是一樣的.

 區(qū)別在于jar壓縮的文件默認多一個META-INF的文件夾,該文件夾下包含一個Manifest.mf(清單文件)的文件

 通常來說jar命令得到的壓縮包有三種(壓縮格式完全一樣,只是后綴名不同而已):

  A、*.jar - 它里面包含N個class文件。

  B、*.war (web) - 它是一個web應用打包生成的。

  C、*.ear(Enterprise) -它是一個企業(yè)應用打包生成的包


二、jar命令用法:

 -c 創(chuàng)建新的歸檔文件

 -t 列出歸檔目錄和文件

 -x 解壓縮已歸檔的指定(或所有)文件

 -u 更新現(xiàn)有的歸檔文件

 -v 在標準輸出中生成詳細輸出 / 提供更詳細輸出信息

 -f 指定歸檔文件名 / 為壓縮包指定名字

 -m 包含指定清單文件中的清單信息

 -e 為捆綁到可執(zhí)行 jar 文件的獨立應用程序


指定應用程序入口點

 -0 僅存儲,不壓縮,只是打包;不使用任何 ZIP 壓縮

 -M 不創(chuàng)建條目的清單文件 META-INF/MANIFEST.MF

 -i 為指定的 jar 文件生成索引信息

 -C 更改為指定的目錄并包含其中的文件

1、創(chuàng)建壓縮包

 jar -cf mytest.jar *.class

 //將當前目錄下的*.class文件壓縮到上一級目錄的mytest.jar文件內(nèi)

 jar -cvf mytest.jar *.class

2、創(chuàng)建壓縮包,不生成清單文件MANIFEST.MF 大寫M

 jar -cMf mytest.jar *.class

3、查看壓縮包

 jar -tf mytest.jar

 jar -tvf mytest.jar

4、解壓

 jar -xf mytest.jar //解壓到當前目錄

 jar -xvf mytest.jar 解壓可看到詳細的過程

5、更新壓縮包

 jar -uvf mytest.jar 要加入的指定class文件


為什么要制作jar包?

 一個真實項目中,涉及到的class文件是非常多的。非常多的class文件存在以下問題:

  a.系統(tǒng)管理不方便;

  b.JVM要分開依次加載不同的*.class文件,效率很低,于是就可以把多個class文件打包成一個jar包,這樣好處是:

   ?、?多個class文件都統(tǒng)一成一個jar包方便管理;

   ?、?JVM可以直接加載jar包就可以一次性加載N個類,效率更高


 打包成可執(zhí)行性jar包

  通過 -e 選項 告訴系統(tǒng)哪個類是該jar包的主類

  jar -cvfe mytest.jar UserTest *.class(指定的主類)

  如果機器上安裝了獨立的虛擬機,只要雙擊“可執(zhí)行性”的jar包即可執(zhí)行

  java -jar jar包名? ? -指定要執(zhí)行的jar包

如果不需要生成清單文件MANIFEST.MF,可以直接使用WinRAR或Winzip來壓縮(必須壓縮成zip格式),解壓也可如此

一。操作零散的單個或幾個class文件

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

二。把一個文件夾下面的所有class文件打成jar包

jar cvf ibstool.jar * 回車

生成可執(zhí)行jar包:

編譯的class文件中必須有main入口函數(shù)的類方能生成可執(zhí)行jar包,如:

public static void main(String[] args)

生成的方法步驟:

方法一:

1。用上面的方法把class與相應的結(jié)構(gòu)目錄打成jar包

2。解壓這個jar包到當前目錄

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 (回車)

(注意回車與空格,這個文件的內(nèi)容排版必須標準)

4。再用winzip把這些文件壓縮成jar格式包,或者壓成zip包,再改后綴名為jar也可。

方法二(推薦):

2. 打成可執(zhí)行的jar包

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

在此目錄準備好一個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.測試可執(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

補充:

關(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中的包說明文件. 下面這個報錯一直出現(xiàn).

could not find main class. Program will exit

這個錯誤提示其實不是沒有發(fā)現(xiàn)main class. 而是jar如果有錯誤執(zhí)行不了,就會出現(xiàn)這個錯誤. 打包完成后, 要先運行 cmd -> java -jar

your.jar 確認沒有問題即可執(zhí)行jar. 使用-jar參數(shù)后, 系統(tǒng)的Classpath 變量不再起作用. 虛擬機將去MANIFEST.MF中的Class-Path 下找相

關(guān)的包.

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

. 明明有main class嗎.

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

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

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

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

運行jar需要命令: java -jar Test.jar

雙擊也可以, 則使用 javaw 打開.

關(guān)于java -classpath a.jar;b.jar; class test.Test 執(zhí)行時. a.jar;b.jar; 后面都必須有分號. 否則報錯. 不要指望不寫classpath讓系統(tǒng)

自己找. 這不是在eclipse里面.必須寫上你要使用的類. 否則總會提示您編譯出錯.

可以用的上的有:

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

? ? 2. Class-Path 指定jar包的依賴關(guān)系,class loader會依據(jù)這個路徑來搜索class。

我平時用mf文件一般說來都是讓jar成為可以直接運行這一目的。雖然目的這么簡單,但是每次打包還是很容易出現(xiàn)各種各樣的問題讓人頭痛。

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函數(shù)的類,程序的入口

Class-Path 用到的一些包

分析一下要點:

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

也就是說務必寫為:

Main-Class:(空格)YouClassName

Class-Path:(空格)Class1.Jar

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

)這樣的錯。不再IDE幫助下做的JAR會發(fā)現(xiàn)MF沒有起到應有的作用。順便說一下以前我看到JBuilder報另一個個錯大概說是什么換行符不對,好

像也是由于這個問題引發(fā)的。原先總以為是windows里邊的回車是由回車,換行2個字符構(gòu)成而造成的?,F(xiàn)在看來好像不是這樣,是因為少了冒

號后邊那個空格。

要點2:Class-Path里邊的內(nèi)容用空格分隔而不是逗號或者分號。(唉。。。我總是下意識的用分號)

也就是說務必寫成:

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

要點3:有的文章說MF文件每行不能超過七十多的字符,我的經(jīng)驗是如果在JBuilder里編輯MF超過了也無妨,一般我是盡量一行寫完。續(xù)行挺麻

煩又要以空格開頭什么的。我也經(jīng)常直接用winRar打開jar然后直接編輯里邊的mf文件,這是個好方法,很直接了當,缺點就是如果改壞了也不

會報錯,只是MF有的部分失效了,好像運行時也會說"錯誤的MF文件版本"。

介紹幾個技巧:

技巧1:使用winRar打開jar,雙擊MF文件,就可以編輯了,編輯完了Ctrl+S保存。特方便。也可以在外邊寫好一個Manifest.mf,然后直接拖入

覆蓋以前的。

技巧2:寫一個run.bat來運行你的jar。run.bat大體內(nèi)容如下:

java -jar yours.jar

pause

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • jar的作用 jar(Java Archive)能夠?qū)⒍鄠€源碼、資源等文件打包到一個歸檔文件中。 jar是jdk自...
    tracy_668閱讀 4,321評論 0 2
  • 1、jar簡介 Java歸檔文件格式(Java Archive, JAR)能夠?qū)⒍鄠€源碼、資源等文件打包到一個歸檔...
    SpaceCat閱讀 40,380評論 4 64
  • jar文件聽說過嗎,沒有?或者陌生!好,沒關(guān)系,這就是我們的第一站:打包發(fā)布。 為什么會有這個玩意呢,首先,這是j...
    輕舞琉璃殤閱讀 768評論 0 0
  • ANT build.xml文件詳解(一) Ant的概念 可能有些讀者并不連接什么是Ant以及入可使用它,但只要使用...
    SkTj閱讀 4,188評論 0 2
  • 天空是湛藍色的無底畫板,漫天云朵是肆意的潑墨彩筆,繪制著七彩璀璨圖案。 歲月是把殺豬刀,其實歲月是把豬飼料。誰說的...
    夏魚shatter閱讀 406評論 0 0

友情鏈接更多精彩內(nèi)容