我已经尝试了Oracle的Java教程中的两个示例。它们都可以编译,但在运行时,都会出现这个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    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:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

我想我可能把Main.java文件放在错误的文件夹里了。

下面是目录层次结构:

graphics
├ Main.java
├ shapes
|   ├ Square.java
|   ├ Triangle.java
├ linepoint
|   ├ Line.java
|   ├ Point.java
├ spaceobjects
|   ├ Cube.java
|   ├ RectPrism.java

这是Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2, 3, 15);
        Line l = new Line(1, 5, 2, 3);
        Cube c = new Cube(13, 32, 22);
    }
}

我哪里做错了?

更新

在我把Main类放入图形包之后(我添加了图形包;对于它),将类路径设置为“_test”(包含图形的文件夹),编译它,并使用Java图形运行它。Main(从命令行),它工作正常。

真的很晚更新#2

我没有使用Eclipse(只有notepad++和JDK),上面的更新解决了我的问题。然而,这些答案中似乎有许多是针对Eclipse和IntelliJ IDEA的,但它们具有类似的概念。


当前回答

对于我的项目,解决这个问题的是Chrome浏览器和chromedriver不兼容。我有一个非常旧的驱动程序版本,甚至不能打开浏览器。我刚刚下载了两者的最新版本,问题解决了。

我是如何发现这个问题的?因为我使用Selenium本机Firefox驱动程序运行我的项目,我的应用程序中包含一个旧版本的FF。我意识到问题是浏览器和驱动程序不兼容。

希望这可以帮助任何人与我类似的问题,产生了同样的错误消息。

其他回答

在编译代码之后,程序中的每个类都有.class文件。这些二进制文件是Java解释以执行程序的字节码。NoClassDefFoundError表示负责动态加载类的类加载器(在本例中为java.net.URLClassLoader)无法为您试图使用的类找到.class文件。

Your code wouldn't compile if the required classes weren't present (unless classes are loaded with reflection), so usually this exception means that your classpath doesn't include the required classes. Remember that the classloader (specifically java.net.URLClassLoader) will look for classes in package a.b.c in folder a/b/c/ in each entry in your classpath. NoClassDefFoundError can also indicate that you're missing a transitive dependency of a .jar file that you've compiled against and you're trying to use.

例如,如果你有一个类com.example。Foo,编译后你会有一个类文件Foo。class。例如,您的工作目录是…/project/。那个类文件必须放在…/project/com/example,然后将类路径设置为…/project/。

旁注:我建议充分利用Java和JVM语言的惊人工具。像Eclipse和IntelliJ IDEA这样的现代ide和像Maven或Gradle这样的构建管理工具将帮助您不必担心类路径,而将注意力集中在代码上!也就是说,这个链接解释了在命令行上执行时如何设置类路径。

我删除了文件夹“build”和“out”,IDE重新构建这个文件夹并更新了内容文件。

我在使用Android studio进行Android开发时也遇到了同样的问题。提供的解决方案是一般的,对我没有帮助(至少对我来说)。

经过几个小时的研究,我找到了以下解决方案,它可能会帮助使用Android Studio进行开发的Android开发人员。

修改如下:

首选项→构建、执行、部署→立即运行→*取消第一个选项。

有了这个改变,我就可以开始工作了。

如果您从JAR文件“开始”一个类,请确保从JAR完整路径开始。例如,(如果你的“主类”没有在Manifest中指定):

java -classpath "./dialer.jar" com.company.dialer.DialerServer

如果存在任何依赖关系,例如对其他JAR文件的依赖关系,则可以解决此类依赖关系

或者通过将这样的JAR文件(每个JAR文件的完整路径)添加到类路径。例如,

java -classpath "./libs/phone.jar;./libs/anotherlib.jar;./dialer.jar" com.company.dialer.DialerServer

或者通过向清单中添加“依赖JAR无文件”来编辑JAR清单。这样的清单文件可能如下所示:

Manifest-Version: 1.0
Class-Path: phone.jar anotherlib.jar
Build-Jdk-Spec: 1.8
Main-Class: com.company.dialer.DialerServer

或者(如果你是一个有源代码的开发人员),你可以使用Maven为你准备一个清单,添加到*。pom文件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.company.dialer.DialerServer</mainClass>
                <!-- Workaround for Maven bug #MJAR-156 (https://jira.codehaus.org/browse/MJAR-156) -->
                <useUniqueVersions>false</useUniqueVersions>
            </manifest>
        </archive>
    </configuration>
</plugin>

请注意,上面的例子使用;作为类路径中的分隔符(它对Windows平台有效)。在Linux上,替换;:。

例如,

java -classpath ./libs/phone.jar:./libs/anotherlib.jar:./dialer.jar
com.company.dialer.DialerServer

这种情况经常发生在我的Genymotion设备上。

确保在安装Genymotion的驱动器上有足够的可用内存。