在Linux上运行程序时出现Java“NoClassDefError”

时间:2013-06-23 09:00:10

标签: java noclassdeffounderror

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

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

这个问题确实令人费解,因为编译工作正常,而program_name.class文件存在于该文件夹中。 weka.jar也存在。

有人可以告诉我我做错了吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

怎么样 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

答案 1 :(得分:0)

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

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

时,您将在日志中看到以下行

如何解决java.lang.NoClassDefFoundError:

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

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

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

答案 2 :(得分:0)

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

喜欢这样

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

用weka.jar的路径替换路径(除非它与你编译的路径在同一路径,然后只是把。:weka.jar)

还要确保将所需的课程加载/导入到程序中,例如

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