【问题标题】:java.lang.NoClassDefFoundError at Runtime: Need Class not on Classpathjava.lang.NoClassDefFoundError at Runtime: Need Class not on Classpath
【发布时间】:2013-09-26 22:48:00
【问题描述】:

我已经尝试了该网站上建议的几种方法以及其他几种方法,但均无济于事。

-运行 Angstrom 嵌入式 Linux、OpenJDK6、Shark VM。

文件结构

所有 .java 和 .jar 文件都存储在目录 ./src 中

  • jar 文件:j1.jar j2.jar

  • 源码:Coder.java、WrapperClass.java

编译运行

  • javac -cp j1.jar:j2.jar Coder.java WrapperClass.java
  • 成功编译,输出Coder.class、WrapperClass.class以及其他几个文件包括Coder$1.class到Coder$6.class,还有Coder$Main_thread.class和Coder$Progress_Bar_Thread.class,对所有这些 .class 文件的用途有任何见解吗?

  • 运行尝试都以 java.lang.ClassNotFoundException 终止。

    • ~/coder/src: java Package.Coder
    • ~/coder/src: java -cp jar1.jar:jar2.jar Package.Coder
    • ~/coder: java ./src/Package.Coder
    • ~/coder: java -cp jar1.jar:jar2.jar ./src/Package.Coder

非常感谢您的帮助。我已经在 NetBeans 上运行了它,并且可以验证它的功能代码,只需让它在 Linux 上运行即可。

堆栈跟踪是:

线程“main”中的异常 java.lang.NoClassDefFoundError: Package/Coder Caused by: java.lang.ClassNotFoundException: Package.Coder

在 java.net.URLClassLoader$1.run(URLClassLoader.java:217)

在 java.security.AccessController.doPrivileged(Native Method)

在 java.net.URLClassLoader.findClass(URLClassLoader.java:321)

在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)

在 java.lang.ClassLoader.loadClass(ClassLoader.java:266)

在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334)

找不到主类:Package.Coder。程序将退出

【问题讨论】:

  • 提供有关 excption 的完整详细信息。 1.是ClassNotFoundException还是NoClassDefFoundError?这不是无关紧要的。 2. 究竟是哪个类没有找到?
  • 旁注:1.您显然是在根(默认)包中定义您的类。仅此一项就不是一个好主意,可能会导致问题。 2. 您误用源目录作为保存 jar 的地方。 3. 为编译的类使用单独的目标目录会更好。
  • 您尝试运行Package.Coder 类,但没有证据表明Package 是一个包,因为那时源文件需要位于Package 子目录中。但是,切勿在包名称中使用大写字母。
  • 线程“主”java.lang.NoClassDefFoundError 中的异常,原因是:java.lang.ClassNotFoundException。此外,它实际上位于 ~/Desktop/Coder/src。
  • NoClassDefFoundError 总是由底层ClassNotFoundException 引起,但它与诊断更相关。您仍未提供有关错误的完整信息。

标签: java jar classpath classnotfoundexception


【解决方案1】:

假设这个结构

/coder
    /src
        /Package
            /Coder.java
            /WrapperClass.java
        /j1.jar
        /j2.jar

您需要从/src 编译为

javac -cp j1.jar:j2.jar Package/Coder.java Package/WrapperClass.java

这将在/Package 中创建.class 文件。然后你可以再次从/src 运行它

java -cp j1.jar:j2.jar Package.Coder

假设Coder 类有一个main 方法,这是您的入口点。

【讨论】:

  • 我按照您的建议进行了重组。程序也会按照您所说的那样编译。 Coder 类确实有一个 main 方法,但是我在运行时收到同样的错误。
  • @User 您必须需要一个不在您的类路径中的类。请编辑您的问题并添加错误的完整堆栈跟踪。
  • 该错误将是:`线程“main”中的异常 java.lang.NoClassDeffoundError: Package/Coder
  • Package 目录中是否有Coder.class 文件,您是否从/src 运行它?
  • 抱歉,我对 Linux 缺乏经验。如何提供完整的堆栈跟踪?
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 2018-04-05
  • 2017-12-03
  • 2022-01-12
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多