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


当前回答

如果您正在使用Maven,这可能是由于pom.xml中依赖关系的范围(如果它们被设置为“提供”),请尝试将其更改为“编译”。

其他回答

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

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

修改如下:

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

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

当在类路径中找不到预期的类时,就会发生无类定义异常。

在编译时类:类是从Java编译器生成的,但在运行时不知道为什么找不到依赖类。

让我们来看一个简单的例子:

public class ClassA{
    public static void main(String args[]){
         // Some gibberish code...
         String text = ClassB.getString();
         System.out.println("Text is: " + text);
    }
}

public class ClassB{
    public static String getString(){
        return "Testing some exception";
    }
}

现在让我们假设上述两个Java源代码被放置在某个文件夹中,例如“NoClassDefinationFoundExceptionDemo”

现在打开一个shell(假设Java已经正确设置)

Go to folder "NoClassDefinationFoundExceptionDemo" Compile Java source files javac ClassB javac ClassA Both files are compiled successfully and generated class files in the same folder as ClassA.class and ClassB.class Now since we are overriding ClassPath to the current working director, we execute the following command java -cp . ClassA and it worked successfully and you will see the output on the screen Now let's say, you removed ClassB.class file from the present directory. And now you execute the command again. java -cp . ClassA Now it will greet you with NoClassDefFoundException. As ClassB which is a dependency for ClassA is not found in the classpath (i.e., the present working directory).

我今天遇到了这个问题。我有一个Android项目,启用multidex后,项目将不再启动。

原因是我忘记了调用特定的multidex方法,该方法应该添加到Application类中,并在所有其他事情之前调用。

 MultiDex.install(this);

遵循本教程正确启用multidex。https://developer.android.com/studio/build/multidex.html

您应该将这些行添加到Application类中

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

我在Android Studio中也遇到过这种情况。

对我来说有效的解决方案是:重启Android Studio。

如果您从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