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