我已经尝试了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的,但它们具有类似的概念。


当前回答

对于Meteor或Cordova用户,

这可能是由您使用的Java版本引起的。对于Meteor和Cordova,现在坚持使用版本8。

检查可用的Java版本/usr/libexec/java_home -V,并查找Java版本8的路径名 设置Java版本8的路径 出口JAVA_HOME = /图书馆/ Java / Home / JavaVirtualMachines / jdk1.8.0_191.jdk /内容 检查是否完成 echo $ JAVA_HOME

继续编写代码。

其他回答

如果您正在使用一个以上的模块,您应该有

dexOptions {
    preDexLibraries = false
}

在构建文件中。

Java 11 + Eclipse解决方案:

如果您在Eclipse项目中没有使用module-info.java,并且手动添加JAR文件,而不是使用Maven/Gradle,则此解决方案适合您。

右键单击项目→生成路径→配置生成路径→库选项卡 从模块路径中删除有问题的JAR文件 将JAR文件添加到类路径中

更多信息请参阅 在Eclipse中,modulepath和classpath之间的区别是什么?

此异常的错误来源之一可能源于Proguard的不一致定义,例如缺少

-libraryJars “path.to.a.missing.jar.library”。

这就解释了为什么在JAR文件存在的情况下,编译和运行工作正常,而清理和构建则失败。记住要在ProGuard设置中定义新添加的JAR库!

请注意,来自ProGuard的错误消息确实不符合标准,因为它们很容易与JAR文件根本不存在时到达的类似Ant消息混淆。只有在最底部才会有ProGuard遇到麻烦的小提示。因此,开始搜索传统的类路径错误等是非常合乎逻辑的,但这将是徒劳的。

显然,NoClassDefFound异常将是运行时的结果,例如,基于缺乏ProGuard一致性构建的可执行JAR文件。有人称之为ProGuard“地狱”。

我在Git分支更改后得到了这个错误。对于Eclipse的特定情况,在org.eclipse.wst.common.component文件的.settings目录中遗漏了几行。如下图所示。

使用Maven安装恢复项目依赖关系会有所帮助。

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

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

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