【问题标题】:Java "NoClassDefError" while running the program on Linux在 Linux 上运行程序时出现 Java“NoClassDefError”
【发布时间】:2013-06-23 09:00:10
【问题描述】:

我有一个导入一些 Weka 包的 Java 程序。我基本上使用“javac -classpath CLASSPATH:weka.jar program_name.java”命令编译它,一切都很好。

当我使用“java -Xmx2024m -classpath CLASSPATH:weka.jar program_name”运行它时,程序抛出“NoClassDefFound”错误,指出找不到主类“program_name”!

这个问题真的很令人费解,因为编译成功了,而且文件夹中存在 program_name.class 文件。 weka.jar 也存在。

谁能告诉我我做错了什么?

谢谢!

【问题讨论】:

  • 您是否在 CLASSPATH 声明的前面缺少 $ (或 % 取决于操作系统)?
  • 创建program_name.class的目录需要在类路径中,例如-classpath .:$CLASSPATH:weka.jar如果它在当前目录中。
  • 感谢您的回访! "$" 引发错误。我尝试了 Java Devil 的建议,但仍然收到 NoClassDefFound 消息。当我使用 Eclipse (Windows) 运行该程序时,该程序运行良好。当我尝试从终端运行它时,我遇到了这个问题。
  • java -Xmx2024m -classpath %CLASSPATH%:.:/weka.jar program_name 怎么样。
  • 我试过了,但我仍然遇到同样的问题,Dave。为了让我的解释更清楚一点,我将 Java 程序放在 weka-3-7-9 目录中(weka.jar 也在同一目录中)。我看到编译时正在创建类文件,但我只是不明白为什么它无法识别类文件。

标签: java noclassdeffounderror


【解决方案1】:

怎么样 java -Xmx2024m -classpath %CLASSPATH%:.:<path_to>/weka.jar program_name

您尝试运行的程序(包括其包名)必须可以从您所在的目录导航。

所以,如果你的程序是 com.dave.MyProgram 并且你将它编译到 /home/dave/bin 中,并且 weka.jar 文件在 /tmp 中。那你就试试

cd /home/dave/bin

java -Xmx2024m -classpath .:/tmp/weka.jar com.dave.MyProgram

这是创建一个包含当前目录和 /tmp/weka.jar 的类路径,并运行程序的完全限定名称。

如果您的程序不在包中,则 colland 将是

java -Xmx2024m -classpath .:/tmp/weka.jar MyProgram

【讨论】:

  • 程序不在包中。为了方便起见,我将程序编译到 /home/../folder/weka-3-7-9 (即我编译程序时在 weka-3-7-9 目录中,并且出现了类文件那里)。 weka.jar和class文件基本在同一个目录下。但是,我仍然收到错误消息。
  • 其实我把程序编译到不同的目录后试试你刚才说的。请给我一点时间。
  • 如果它们都在同一个目录中并且类不在包中,则需要确保“。”在你的类路径上。您可能还必须使用“;”而不是“:”来分隔类路径上的项目。 Windows 和 Unix 机器的分隔符是不同的。如果程序和 jar 文件在同一个目录中,并且您的程序不在包中,并且您已经 cd'd 到该目录,那么您的命令将是 java -Xmx2024m -classpath 。我的程序
  • 非常感谢戴夫!当我用另一个较小的程序对其进行测试时,它终于起作用了。我得到那个文件未找到错误,因为我的程序试图从我重命名的文件中读取(我忘记在程序中更改它),并且内存分配确实取决于我的程序。我在它们弹出时删除了那些 cmets,因为我做了一些愚蠢的事情。无论如何,再次感谢您对此进行调查!
【解决方案2】:

Java 中的 NoClassDefFoundError 出现在 Java 虚拟机无法在运行时找到在编译期间可用的特定类时。例如,如果我们有一个类的方法调用或访问一个类的任何静态成员,并且该类在运行时不可用,那么 JVM 将抛出 NoClassDefFoundError。重要的是要了解这与 ClassNotFoundException 不同,后者仅在尝试在运行时加载类时出现,并且名称是在运行时而不是在编译时提供的。许多 Java 开发人员将这两个错误混为一谈而感到困惑。

简而言之,如果类在编译期间存在但在运行期间在 java 类路径中不可用,则会出现 NoClassDefFoundError。通常,当您收到 NoClassDefFoundError 时,您会在日志中看到以下行:

如何解决 java.lang.NoClassDefFoundError:

Java 解决方案中的 java.lang.NoClassDefFoundError NoClassDefFoundError 的明显原因是特定类在 Classpath 中不可用,因此我们需要将其添加到 Classpath 中,或者如果我们期望它,我们需要检查为什么它在 Classpath 中不可用成为。可能有多种原因,例如:

1) 类在 Java 类路径中不可用。 2)您可能正在使用 jar 命令运行程序,并且清单文件的 ClassPath 属性中未定义类。 3) 任何启动脚本都覆盖了 Classpath 环境变量。 4)因为 NoClassDefFoundError 是 java.lang.LinkageError 的一个子类,所以如果它的一个依赖项(如本机库)可能不可用,它也会出现。 4) 检查日志文件中的 java.lang.ExceptionInInitializerError。由于静态初始化失败导致的 NoClassDefFoundError 很常见。 5) 如果您在 J2EE 环境中工作,多个 Classloader 之间的 Class 可见性也会导致 java.lang.NoClassDefFoundError,请参阅示例和场景部分进行详细讨论。

我们现在将看到几个例子和场景,当 java.lang.NoClassDefFoundError 出现时以及它是如何解决的。这可以帮助您解决 Java 应用程序中 NoClassDefFoundError 的根本原因。

【讨论】:

【解决方案3】:

尝试编译并运行提供路径,而不是使用 CLASSPATH

像这样

javac -cp .:(path)/weka.jar program_name.java

将路径替换为 weka.jar 的路径(除非它与您正在编译的路径在同一路径中,否则只需放入 .:weka.jar)

还要确保你正在加载/导入你需要的类到你的程序中,例如

Class.forName("what.ever.the.weka.class.you.are.using.is");

【讨论】:

  • 感谢您回来!我试过了,但我仍然得到错误。当我使用 Eclipse 时,该程序运行良好。如果我使用 import 语句而不是 Class.forName("...") 可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多