2013-04-13 149 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部分。