JAVA:无法运行jar文件

时间:2013-04-13 12:18:28

标签: java jar noclassdeffounderror manifest.mf

我是JAVA的新手并且无法弄清楚我创建的项目有什么问题。

我在eclipse中创建了一个JAVA项目并导出了一个jar(不是runnable jar)。 我在导出时取消选中.project和.classpath文件选项。现在我正在尝试运行该jar并获取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被抛出?我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:3)

要使 -jar 选项生效,您必须在清单中添加 Main-class 键。 请参阅java命令文档http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html

-jar选项

执行封装在JAR文件中的程序。第一个参数是JAR文件的名称而不是启动类名称。 为了使此选项有效,JAR文件的清单必须包含 Main-Class:classname 形式的行。这里,classname标识具有public static void main(String [] args)方法的类,该方法充当应用程序的起点。

答案 1 :(得分:0)

使用-jar选项时,也会从MANIFEST.mf文件中读取类路径。来自-jar选项的文档:

  

使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。

这意味着您必须在清单文件的Class-Path部分添加所有依赖项。