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


当前回答

我使用Eclipse的FileSync插件,所以我可以在Tomcat上进行实时调试。我收到了NoClassFoundError,因为我在Tomcat的元数据中为Eclipse workspace =>类中的bin目录添加了一个同步条目,但我还没有为Eclipse =>中的extlib目录添加一个文件夹同步

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib

其他回答

如果您正在使用gradlew,请访问。/gradle/wrapper/gradle-wrapper。并将distributionUrl更改为正确的Gradle版本。

如果您正在使用JDK14,请尝试:

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

对于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

继续编写代码。

这个答案特定于服务中发生的java.lang.NoClassDefFoundError:

我的团队最近在升级提供服务的rpm后看到了这个错误。rpm和其中的软件都是用Maven构建的,所以我们似乎有一个编译时依赖项,只是没有包含在rpm中。

然而,在进行调查时,未找到的类与堆栈跟踪中的几个类位于同一个模块中。此外,这不是一个最近才添加到构建中的模块。这些事实表明,这可能不是Maven依赖关系的问题。

最终的解决方案:重新启动服务!

rpm升级似乎使服务在底层JAR文件上的文件句柄失效。然后,该服务看到一个没有加载到内存中的类,在jar文件句柄列表中搜索它,但未能找到它,因为它可以从中加载类的文件句柄已失效。重新启动该服务将迫使它重新加载所有的文件句柄,从而允许它在rpm升级后立即加载内存中没有找到的类。

Java中的NoClassDefFoundError:

定义:

如果一个类在编译时存在,但在运行时java类路径中不可用,则会出现NoClassDefFoundError。通常,当你获得NoClassDefFoundError时,你会在log中看到下面这行: 线程“main”异常

可能的原因:

The class is not available in Java Classpath. You might be running your program using jar command and class was not defined in manifest file's ClassPath attribute. Any start-up script is overriding Classpath environment variable. Because NoClassDefFoundError is a subclass of java.lang.LinkageError it can also come if one of it dependency like native library may not available. Check for java.lang.ExceptionInInitializerError in your log file. NoClassDefFoundError due to the failure of static initialization is quite common. If you are working in J2EE environment than the visibility of Class among multiple Classloader can also cause java.lang.NoClassDefFoundError, see examples and scenario section for detailed discussion.

可能的决议:

验证所有必需的Java类都包含在应用程序的类路径中。最常见的错误是,在开始执行依赖于一些外部库的Java应用程序之前,没有包括所有必要的类。 应用程序的类路径是正确的,但是classpath环境变量在应用程序执行之前被重写。 验证前面提到的ExceptionInInitializerError没有出现在应用程序的堆栈跟踪中。

资源:

解决Java J2EE中Java .lang. noclassdeffounderror的3种方法

noclassdeffounderror -如何解决没有类Def发现错误

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

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