Java NoClassDefFoundError即使该类存在

时间:2014-02-13 10:06:31

标签: java classpath noclassdeffounderror classnotfoundexception

我正在试图弄清楚类导入是如何在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

谢谢!

3 个答案:

答案 0 :(得分:1)

检查您的类路径并确保当前目录(包含pkgA和pkgB的目录)位于类路径中。

答案 1 :(得分:1)

请注意,您的类路径规范必须类或.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等)。当您添加源文件,配置或依赖项时,这将使生活更易于管理。

答案 2 :(得分:0)

并不总是关于你第一次看到的课程,而是关于他们中的内容。

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执行某些操作,它将为您提供NoClassDefFoundError,因为它无法完全加载所有依赖项以将其限定为有效类。换句话说,无法完全解析所有网址。

即使你有依赖管理器,这种问题并不罕见。 Maven的。您可能会忘记在某些jar /类(例如Java Tools.jar)上存在编译时依赖关系,您还需要在启动应用程序时加载它们。