Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoClassDefFoundError,即使该类存在_Java_Classpath_Noclassdeffounderror_Classnotfoundexception - Fatal编程技术网

Java NoClassDefFoundError,即使该类存在

Java NoClassDefFoundError,即使该类存在,java,classpath,noclassdeffounderror,classnotfoundexception,Java,Classpath,Noclassdeffounderror,Classnotfoundexception,我试图弄清楚类导入在Java中是如何工作的。我有以下文件结构: testProject pkgA A.java A.class dir pkgB B.java B.class java的内容包括: package pkgA; public class A { public static String funcA() { return "funcA in cl

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

testProject
    pkgA
        A.java
        A.class
    dir
        pkgB
            B.java
            B.class
java的内容包括:

package pkgA;

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

import pkgA.A;

public class B {
    public static void main(String[] args) {
        System.out.println((new A()).funcA());
    }
}
B.java的内容包括:

package pkgA;

public class A {
    public static String funcA() {
        return "funcA in class A in pkgA";
    }
}
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 ..
java pkgB/B -classpath ..
上面的命令不打印任何内容

在testProject/dir中,我运行:

javac pkgB/B.java -classpath ..
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


谢谢

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

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

java -classpath .. pkgB/B 
(这同样适用于
javac
调用)

我会同时编译所有的东西

javac -classpath {whatever} {complete list of .java files}
为了一致性

指定目录(例如称为类的目录)。这使得管理代码和编译工件的工作变得更简单


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

这并不总是关于你第一次看到的类,而是关于它们中的内容

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

2) 该类导入“com.my.other.clazz”

3) 在CLAZ中有一个静态方法

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(); 

}
如果您试图静态地从CLAZ执行某些操作,它将给出NoClassDefFoundError,因为它无法完全加载所有依赖项以将其限定为有效类。换句话说,无法完全解析所有URL


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

此外,由于fktA()是静态的,因此不需要类实例来调用它:System.Out.println(a.fktA());应该足够了。您的第一个命令什么也不做,因为没有定义合适的入口点(至少从您发布的内容来看)。“直接运行”类需要公共静态void Main(字符串[]args)。谢谢您的回答。这本书很有见地,你能为我在哪里进一步阅读提供参考吗?对于java来说,这是一个非常新的问题,并且遇到了类似的问题。还是不知道确切的原因