【问题标题】:Java NoClassDefFoundError even though the class existsJava NoClassDefFoundError 即使类存在
【发布时间】:2014-03-12 03:22:59
【问题描述】:

我试图弄清楚类导入在 Java 中是如何工作的。我有以下文件结构:

testProject
    pkgA
        A.java
        A.class
    dir
        pkgB
            B.java
            B.class

A.java的内容是:

package pkgA;

public class A {
    public static String funcA() {
        return "funcA in class A in pkgA";
    }
}

B.java的内容是:

package pkgB;

import pkgA.A;

public class B {
    public static void main(String[] args) {
        System.out.println((new A()).funcA());
    }
}

在 testProject 我运行:

javac pkgA/A.java

上面的命令不打印任何东西。

在 testProject/dir 我运行:

javac pkgB/B.java -classpath ..

上面的命令不打印任何东西。

在 testProject/dir 我运行:

java pkgB/B -classpath ..

上面的命令打印如下:

Exception in thread "main" java.lang.NoClassDefFoundError: pkgA/A
    at pkgB.B.main(B.java:7)
Caused by: java.lang.ClassNotFoundException: pkgA.A
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 1 more

我做错了什么?

将类路径作为绝对路径没有帮助。

$ java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

操作系统是 Ubuntu 12.04

谢谢!

【问题讨论】:

  • 此外,由于 fktA() 是静态的,因此不需要类实例来调用它: System.Out.println(A.fktA());应该足够了。您的第一个命令什么也不做,因为 A 没有定义合适的入口点(至少从您发布的内容来看)。 “直接运行”一个类需要一个 public static void Main(String[] args)。

标签: java classpath noclassdeffounderror classnotfoundexception


【解决方案1】:

检查您的类路径并确保当前目录(保存 pkgA 和 pkgB 的目录)在类路径中。

【讨论】:

    【解决方案2】:

    请注意,您的类路径规范必须类或 .java 文件之前,例如

    java -classpath .. pkgB/B 
    

    (同样适用于javac 调用)。

    我会同时编译所有东西,例如

    javac -classpath {whatever} {complete list of .java files}
    

    为了一致性。

    指定compiler output directory to be separate to your source(例如,一个名为 classes 的目录)。在管理代码和编译的工件方面,这让生活变得更简单。

    接下来,您应该研究构建工具,例如 Maven 或 Ant(或 Gradle 或 Sbt 等)。当您添加源文件、配置或依赖项时,这将使生活更易于管理。

    【讨论】:

      【解决方案3】:

      这并不总是与您第一次看到的课程有关,还与课程中的内容有关。

      1) 你有一个名为“com.my.Clazs”的类。

      2) 类导入“com.my.other.Clazzzz”;

      3) 你在 Clazs 中有一个静态方法

      public static void doFoo() {
      
      
             /* The call to Clazs.doFoo() will result in NCDF Error if you
              * skip Clazzzz lookup in classpath.
              *
              */
             Clazzzz anObject = new Clazzzz(); 
      
      }
      

      如果您尝试从 Clazs 静态执行某些操作,它会给您 NoC​​lassDefFoundError 因为它无法完全加载所有依赖项以使其成为有效类。也就是说,无法完全解析所有的 URL。

      即使你有依赖管理器,这种问题也并不罕见,例如马文。您可能忘记了您在启动应用程序时还需要加载某些 jars/classes(例如 Java Tools.jar)的编译时依赖项。

      【讨论】:

      • 感谢您的回答。它非常有见地,您能否提供任何参考以说明我可以在哪里进一步阅读它?对java来说很新,并且一直停留在类似的问题上。仍然无法弄清楚确切原因
      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2017-08-01
      • 2023-01-16
      • 2012-10-06
      相关资源
      最近更新 更多