繁体   English   中英

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

[英]Java “NoClassDefError” while running the program on Linux

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

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

谢谢!

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

当 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 的根本原因。

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

像这样

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM