-1

我有一个导入一些 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 也存在。

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

谢谢!

4

3 回答 3

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
于 2013-06-23T19:48:32.497 回答
0

当 Java 虚拟机无法在运行时找到在编译期间可用的特定类时,Java 中的 NoClassDefFoundError 就会出现。例如,如果我们有一个类的方法调用或访问一个类的任何静态成员,并且该类在运行时不可用,那么 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 的根本原因。

于 2013-06-23T09:13:26.703 回答
0

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

像这样

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

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

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

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

于 2013-06-23T09:28:54.133 回答