【问题标题】:JAVA: Unable to run a jar fileJAVA:无法运行 jar 文件
【发布时间】:2013-04-13 12:18:28
【问题描述】:

我是 JAVA 新手,想弄清楚我创建的项目出了什么问题。

我在 Eclipse 中创建了一个 JAVA 项目并导出了一个 jar(不可运行的 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?我在这里遗漏了什么吗?

【问题讨论】:

    标签: java jar noclassdeffounderror manifest.mf


    【解决方案1】:

    要使 -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) 方法的类。

    【讨论】:

    • 我确实有主类为hbase.gateway.HBaseGatewayEntryPoint的清单文件...但我没有安装jdk。有关系吗?
    • 理想情况下不应该。尝试不带任何选项运行 java 命令。检查帮助是否显示 -jar 选项。
    • 由于错误来自主类,它不是Main-Class 问题,正如 OP 还指出的那样。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2013-07-04
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2020-08-08
      相关资源
      最近更新 更多