8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

我该如何解决“java.lang.NoClassDefFoundError”?

Adeel Ansari 2月前

169 0

我尝试了 Oracle Java 教程中的两个示例。它们都可以正常编译,但在运行时,都出现了此错误:Exception in thread \'main\' java.lang.NoClassDefFoundError:

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 类放入 graphics 包(我添加 package graphics; 到它)之后,将类路径设置为 _'_test_'(包含图形的文件夹),对其进行编译,然后使用 java graphics.Main (从命令行)运行它,它就起作用了。

真的很晚更新#2

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

帖子版权声明 1、本帖标题:我该如何解决“java.lang.NoClassDefFoundError”?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Adeel Ansari在本站《java》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 程序中每个类 .class 都会得到相应的 NoClassDefFoundError 负责动态加载类的 java.net.URLClassLoader 类加载器(在本例中为 .class 您尝试使用的类的文件。

    如果不存在所需的类(除非使用反射加载类),则您的代码将无法编译,因此通常此异常意味着您的类路径不包含所需的类。请记住,类加载器(特别是 java.net.URLClassLoader )将在类路径的每个条目中的文件夹 a/b/c/ 中查找包 abc 中的类。 NoClassDefFoundError 也可能表示您缺少编译时针对并尝试使用的 .jar 文件的传递依赖项。

    例如,如果您有一个类 com.example.Foo ,则编译后您将得到一个类文件 Foo.class 。例如,您的工作目录是 .../project/ 。该类文件必须放在 中 .../project/com/example ,并且您将类路径设置为 .../project/ .

    附注:我建议利用 Java 和 JVM 语言现有的出色工具。Eclipse 和 IntelliJ IDEA 等现代 IDE 以及 Maven 或 Gradle 等构建管理工具将帮助您不必担心类路径(太多),而只需专注于代码!也就是说, 此链接 解释了如何在命令行上执行时设置类路径。

  • 我之所以读这篇文章,是因为我在尝试在 Android 上运行单元测试时遇到了一个错误。事实证明,在我的情况下,NoClassDefFoundError 是由于测试中缺少依赖项而发生的。我需要考虑依赖项注入来防止出现此类错误。感谢您的详细回答。

  • 我收到此错误是因为为 Form 的布局设置设置了 FormLayout(JGoodies)。这意味着该类库存在需要修复的问题。但它却出现在 IntelliJ 中 Form 的布局列表中。

  • goh 2月前 0 只看Ta
    引用 5

    我想纠正其他人的观点 NoClassDefFoundError .

    NoClassDefFoundError 可能由于多种原因而发生,例如:

    1. ClassNotFoundException —— 无论在编译时是否可用,都找不到所引用的类的 .class(即基类/子类)。
    2. 找到类文件,但在初始化静态变量时引发异常
    3. 找到类文件,初始化静态块时引发异常

    在原始问题中,这是第一种情况,可以通过将 CLASSPATH 设置为引用的类 JAR 文件或其包文件夹来纠正。

    ‘编译时可用’是什么意思?

    • 代码中使用了引用的类。
      例如:两个类,A 和 B(扩展了 A)。如果在代码中直接引用 B,则在编译时可用,即 A a = new B();

    ‘编译时不可用’是什么意思?

    • 编译时类和运行时类是不同的,例如,使用子类的类名加载基类,例如Class.forName(\'classname\')例如:两个类,A和B(扩展A)。代码有
      A a = Class.forName("B").newInstance();
  • 在我的例子中,我编译了一个类,然后将其移动到名为 app 的目录中。我必须添加一行 package app; 并重新编译,然后才能将其移动到子目录 app 中。

  • 除了上面列出的 3 个之外,ClassLoader 也可能导致这样的错误,基本上就是 ClassNotFoundException,在这种情况下,类可能存在于类路径中,但尝试从不同的 ClassLoader 加载

  • 2 和 3 是特定于类加载器的。根据 javadoc,该异常仅适用于原因 1。

  • 我已经测试了案例 2 和案例 3,它不是 NoClassDefFoundError,而是 ExceptionInInitializerError 案例 2. 找到 Class 文件,但在初始化静态变量时引发异常 案例 3. 找到 Class 文件,在初始化静态块时引发异常

  • 引用 10

    @Michael,此链接表明您的堆栈跟踪也将显示该情况下的 NoClassDefFoundError:archive.is/YPbYI#selection-2107.0-2115.13

  • 如果在编译和运行时遇到以下错误之一:

    • p1

    • p2

    • p3

      at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.defineClass(Unknown Source)at java.net.URLClassLoader.access$100(Unknown Source)at java.net.URLClassLoader$1.run(Unknown Source)at java.net.URLClassLoader$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

    - - - - - - 解决方案 - - - - - - -

    问题主要出在包的组织上。您应该根据源代码中的包分类,在文件夹中合理安排类。

    在编译过程中,使用此命令:

    javac -d . [FileName.java]
    

    要运行该课程,请使用以下命令:

    java [Package].[ClassName]
    
  • javac 命令中的 \'-d .\' 可以达到这个效果,它创建了包的文件夹结构,而不是将所有 .class 文件放在根目录中,谢谢!

  • 造成这种情况的一个可能原因 NoClassDefFoundError 是,该类存在于 处的类路径中 Compile time ,但不存在于 Runtime .

    shapes , linepoints spaceobjects .classpath

  • 您这样写答案并不正确。正确的答案应该是:“导致此错误的一个可能原因是……”但可能还有其他原因导致您收到此错误,例如在运行时使用类加载器加载 JAR 文件时。

  • java.lang.NoClassDefFoundError
    

    表示在 编译时 ,但在 运行时却 。也许你只需要将其添加到类路径中。

  • Java中的NoClassDefFoundError:

    定义:

    如果某个类在编译时存在但在运行时不在 Java 类路径中,则会出现 NoClassDefFoundError。通常,当您收到 NoClassDefFoundError:Exception in thread \'main\' java.lang.NoClassDefFoundError 时,您会在日志中看到以下行

    可能的原因:

    1. p4

    2. p5

    3. p6

    4. p7

    5. p8

    6. p9

    可能的解决方案:

    1. p11

    2. p12

    3. p13

    资源:

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

    java.lang.NoClassDefFoundError – 如何解决未找到类定义错误

  • 引用 17

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

    编译时类:类是由 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 已经正确设置)

    1. p5

    2. p6

    3. p7

    4. p8

    5. p9

  • Dirk 2月前 0 只看Ta
    引用 18

    如果你的项目位于类似这样的包中 com.blahcode ,并且你的类名为 Main ,则编译后的文件可能会输出在类似这样的目录结构中 ./out/com/blahcode/Main.class 。对于 IntelliJ IDEA 尤其如此。

    当尝试从 shell 或 cmd 运行时,您需要 cd 包含子目录 com 的内容

    cd out
    java -classpath . com.blahcode.Main
    
  • 如果您要从 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
    
  • 我今天遇到了这个问题。我有一个 Android 项目,启用后 multidex 项目就无法启动了。

    原因是我忘记调用应该添加到其他所有方法中 Application class 并在其他所有方法之前调用的特定 Multidex 方法。

     MultiDex.install(this);
    

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

    您应该将这些行添加到您的应用程序类中

     @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    
返回
作者最近主题: