2013-04-13 143 views
0

我是新的JAVA,並試圖找不出有什麼錯我創建的項目。JAVA:無法運行jar文件

我創建了一個Eclipse Java項目,並導出一個jar(不運行的JAR)。 我在導出時未勾選.project和.classpath文件選項。現在,我試圖運行罐子和獲得的NoClassDefFoundError:

我粘貼命令和下面的錯誤:現在

C:\Users\Anjali>"C:\Program Files\Java\jre7\bin\java.exe" -classpath D:\Web\Hbas 
eGateway\bin;C:\Users\Anjali\Downloads\Hbase\hbase-0.94.5-security.jar;C:\Users\ 
Anjali\Downloads\Hbase\lib\hadoop-core-1.0.4.jar;C:\Users\Anjali\Downloads\Hbase 
\py4j0.7.jar -jar D:\Web\HbaseGateway\bin\HBaseGateway.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: py4j/GatewayServer 
     at hbase.gateway.HBaseGatewayEntryPoint.main(HBaseGatewayEntryPoint.java 
:22) 
Caused by: java.lang.ClassNotFoundException: py4j.GatewayServer 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 1 more 

,有趣的是,我可以在使用運行的主類下面的命令。 在下面的命令中,我刪除了-jar開關並將主類傳遞給java.exe。

C:\Users\Anjali>"C:\Program Files\Java\jre7\bin\java.exe" -classpath D:\Web\Hbas 
eGateway\bin;C:\Users\Anjali\Downloads\Hbase\hbase-0.94.5-security.jar;C:\Users\ 
Anjali\Downloads\Hbase\lib\hadoop-core-1.0.4.jar;C:\Users\Anjali\Downloads\Hbase 
\py4j0.7.jar hbase.gateway.HBaseGatewayEntryPoint 
Gateway Server Started 

爲什麼NoClassDefFoundError被拋出?我在這裏錯過了什麼嗎?

回答

3

對於-jar選項起作用,必須在清單中添加主級關鍵。 參見java命令文檔http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html

-jar選項

執行封裝在JAR文件中的程序。第一個參數是JAR文件的名稱,而不是啓動類名稱。 爲了使這個選項工作,JAR文件的清單必須包含線形式主類:類名。這裏,classname標識具有公共靜態void main(String [] args)方法的類,該方法用作應用程序的起點。

+0

我確實有與主類爲'hbase.gateway.HBaseGatewayEntryPoint' ...但我沒有安裝JDK清單文件。有關係嗎? – Mayank

+0

理想情況下不應該。嘗試運行沒有任何選項的java命令。檢查幫助是否顯示-jar選項。 – JRR

+0

是的。幫助顯示jar。我證實,它並不需要JDK :) – Mayank

0

當您使用-jar選項,類路徑從MANIFEST.mf文件中讀取,以及。從文檔的-jar選項:

When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.

這意味着你必須添加所有的依賴清單文件的Class-Path部分。