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


当前回答

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

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

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

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

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

其他回答

如果你最近在Android Studio中添加了这样的multidex支持:

// To support MultiDex
implementation 'com.android.support:multidex:1.0.1'

所以你的解决方案只是从MultiDexApplication扩展而不是Application:

public class MyApp extends MultiDexApplication {

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

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

修改如下:

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

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

不要在模块之外使用测试类

我没有解决方案,只是另一种“编译时存在,运行时不存在”的情况。

我试图使用来自JUnit测试类的一个非常方便的方法,来自另一个位于不同模块中的测试类。这是一个禁忌,因为测试代码不是打包的jar的一部分,但我没有意识到这一点,因为它对于Eclipse中的用户类来说是可见的。

我的解决方案是将该方法放在作为生产代码一部分的现有实用程序类中。

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

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

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

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

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

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

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