【问题标题】:Java Library Commons Lang3 'ClassNotFoundException' errorJava Library Commons Lang3 'ClassNotFoundException' 错误
【发布时间】:2020-05-29 09:51:28
【问题描述】:
import java.util.Arrays;
import org.apache.commons.lang3.ArrayUtils;

public class MonsterGame {

    public static void main(String[] args)
    {

        Monster.buildBattleBoard();

        char[][] tempBattleBoard = new char[10][10];

        // ObjectName[] ArrayName = new ObjectName[4];

        Monster[] Monsters = new Monster[4];

        // Monster(int health, int attack, int movement, String name)

        Monsters[0] = new Monster(1000, 20, 1, "Frank");
        Monsters[1] = new Monster(500, 40, 2, "Drac");
        Monsters[2] = new Monster(1000, 20, 1, "Paul");
        Monsters[3] = new Monster(1000, 20, 1, "George");

        Monster.redrawBoard();


    for (Monster m : Monsters) {
        if(m.getAlive()) {
            int arrayItemIndex = ArrayUtils.indexOf(Monsters, m);
            m.moveMonster(Monsters, arrayItemIndex);
        }
    }

    Monster.redrawBoard();


}
}

尝试运行此代码时,我收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils
    at MonsterGame.main(MonsterGame.java:55)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.ArrayUtils
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 1 more

我有两个文件,在同一个包中。我只展示了这个,因为我不相信另一个文件是问题所在。 我遵循了一个关于如何使用 java 库的教程:下载、导入、构建路径等。

这里的问题是,导入似乎没问题,但实际上使用库是问题。

我是 Java 新手,如果这是一个非常简单的错误,我很抱歉。

提前感谢您的任何回复/反馈。

【问题讨论】:

  • 在 Java 中,类库(jar)通常放在库路径中,例如lib 并在那里引用。但它们也需要导出到您最终部署的 jar 中。如果您使用 IDE(如 eclipse、intelliJ 或 netbeans),那么您可以在相应的 UI 中执行此操作。因此,将库添加到构建路径只会告诉 IDE 库在哪里,但是一旦部署它,您的程序也需要知道。所以你的部署路径中需要有一个 lib 文件夹(或者你必须将 jar 重新部署到你自己的 jar 中,如果你导出它)。你有机会使用 eclipse 吗?
  • @TreffnonX 我在项目的 lib 目录中引用了该库。部署部分看不懂?
  • 当您将项目“导出”到可运行的jar 时,您必须选中一个复选框,该复选框决定将 apache commons 放入导出的 jar 中。或者,您可以使用其他重新部署方式之一。否则,您正在运行的程序将找不到该库。您的 IDE 知道它在哪里,但您的 jar 不包含它...也可能是您忘记重建项目,但我假设您有某种自动构建活动。

标签: java eclipse oop import classnotfoundexception


【解决方案1】:

您正在使用的引用库 (apache common lang3) 和任何其他库都以三种不同的方式使用。

  1. 首先,您在开发过程中需要该库,因此您的 IDE 可以 当您调用类、对象和方法时,验证您的代码 图书馆。
  2. 在编译过程中你需要这个库,所以 java 编译器可以引用正确的路径,并优化你的代码, 在可能的情况下。
  3. 您在运行时需要该库,当您的程序由 Java 虚拟机运行时,它可以从库中找到您使用的任何内容。

前两个通常被视为一个,因为两者通常都被认为是“编译时间”,尽管严格来说只有第二个实际上是。这意味着您需要为 IDE(第 1 点和第 2 点)和程序(第 3 点)准备好库。您的异常被抛出,因为在运行时,ClassLoader 找不到您的库。 ClassLoader 是 JVM 为其使用的程序加载类的方式。如果JVM没有找到一个类,它就不能继续执行你正在运行的Thread,你可能只运行了一个Thread(一个主线程)。

因此您的程序中断并停止运行。请重新检查您正在使用的关于如何正确导入库的教程或将库导出到您要导出的 jar 旁边的 lib 文件夹。

编辑:当使用最新版本的 eclipse 并将项目导出为可运行的 jar 时,系统会询问您要以何种方式处理库:

如果您没有看到导出对话框的这部分内容,则说明您做错了(可能您没有导出为可运行的 jar)。

【讨论】:

  • 我不明白,因为我没有导出任何东西,我只是想在 Eclipse 中运行程序。我也不明白导入不会报错?
  • 您使用的是基本的eclipse java project,还是其他类型的项目?在一个基本的 java 项目中,您应该能够右键单击任何库 jar 和“构建路径”>“添加到构建路径”。如果这还不够,那么您需要重新构建您的项目(可能是因为您关闭了自动构建功能?)。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2016-05-17
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多