我們經常會見到jar檔案,有些可以直接運行,例如windows下雙擊jar檔案、Linux下使用 " java -jar *.jar "命令, 均能運行jar檔案,
而有些jar檔案卻不能雙擊運行或者使用上述命令運行時提示沒有Main。其中的原因和jar檔案產生辦法有關,只有產生jar檔案時指定了Main方法所在類的才能直接運行。
下面介紹常用的兩種產生jar檔案方法:
(1) 產生jar時指定入口類
例如有如下程式:
[root@localhost javaTest]# ls <Test.java是包含main方法的入口類>
Test.java Test.class
首先,建立一個manifest.mf檔案,並添加相關內容,指定入口類.
[root@localhost javaTest]# vim manifest.mf
Main-Class:<空格>Test<斷行符號>
一定要注意:空格和斷行符號: Main-Class: Test
打包:
[root@localhost javaTest]# jar cvfm x.jar manifest.mf *.class
打包時需要將class檔案打包,當然也可以選擇其它檔案.
運行:
[root@localhost javaTest]# java -jar javaTest.jar
因為指定了入口類,所以這樣運行時會直接運行jar檔案中的Test類.
查看jar檔案中的內容:
使用 " jar xvf *.jar " 解壓jar檔案到目前的目錄下
zkl@hadoopvm01:~/java/Hello> jar xvf x.jar
created: META-INF/
inflated: META-INF/MANIFEST.MF
inflated: Test.class
zkl@hadoopvm01:~/java/Hello> ls
Test.class x.jar META-INF
zkl@hadoopvm01:~/java/Hello> ls META-INF/
MANIFEST.MF
zkl@hadoopvm01:~/java/Hello> cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.6.0_17 (Sun Microsystems Inc.)
Main-Class: Test
我們可以看到有個META-INF/MANIFEST.MF檔案,manifest.mf檔案的內容在打包時會寫入到該檔案當中。
運行jar檔案時,也會讀取該檔案,找到入口類.
(2) 產生jar時不指定入口類
同樣是上面的程式, 首先打包:
[root@localhost javaTest]# jar cvf x.jar *.class
運行:
由於沒有指定入口類, "java -jar x.jar" 命令會出現如下錯誤:
Failed to load Main-Class manifest attribute from x.jar。
我們解壓 x.jar 檔案,查看MANIFEST.MF內容
zkl@hadoopvm01:~/java/Hello> cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.6.0_17 (Sun Microsystems Inc.)
發現於(1)比,少了一行,這就是原因所在。此時需要按如下方式運行jar檔案。
zkl@hadoopvm01:~/java/A> java -classpath x.jar Test
這樣運行時,java會在classpath中搜尋Test類,這裡會在x.jar中搜多到Test,然後運行。
附:
(3) jar 命令複雜打包
外部庫路徑: lib
源碼路徑: src, 有很多包
class檔案所在路徑: bin