如何修复一个简单的Eclipse Java项目中添加的外部JAR的类的NoClassDefFoundError?

How to fix a NoClassDefFoundError for a class from an added External JAR in a simple Eclipse Java Project?

提问人:Sam 提问时间:11/2/2023 最后编辑:Sam 更新时间:11/2/2023 访问量:55

问:

我收到一个错误,我不明白 Apache POI 依赖项。

我创建了一个简单的 Java 项目,并在 Ecplise 控制台中运行。我做了一个用于读取 Excel 文件的 Java 类:

package Main;

import java.io.FileInputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ReadWriteExcel {
    
    public String ReadExcel(String SheetName, int rNum, int cNum) {
        String data = "";
        
        try {
            FileInputStream file = new FileInputStream("C:\\tmp\\test.xlsx");
            Workbook wb = WorkbookFactory.create(file);
            Sheet s = wb.getSheet(SheetName);
            Row r = s.getRow(rNum);
            Cell c = r.getCell(cNum);
            data = c.getStringCellValue();
        }catch(Exception e){
            System.out.println("ReadExcel catch block");
            e.printStackTrace();
        }
        
        return data;
    }
}

当我运行我的主类时,它会抛出异常。它说找不到 Apache POI 类。 这是我的 MainClass :

package Main;

public class MainClass {

    public static void main(String[] args) {

        ReadWriteExcel obj = new ReadWriteExcel();
        String str = obj.ReadExcel("PARAM", 0, 0);
        System.out.println(str);

    }

}

控制台正在编写以下消息:

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/poi/ss/usermodel/WorkbookFactory
    at Main.ReadWriteExcel.ReadExcel(ReadWriteExcel.java:19)
    at Main.MainClass.main(MainClass.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.poi.ss.usermodel.WorkbookFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
    ... 2 more

我想我以我应该的方式添加了包含此类的 jar。我右键单击我的项目>配置构建路径>添加外部 JAR:
JavaBuildPath>Libraries

罐子的名字是我
在那里下载的:https://mvnrepository.com/artifact/org.apache.poi/poi/5.2.4
poi-5.2.4.jar

java eclipse apache-poi noclassdeffounderror

评论

1赞 Andy Thomas 11/2/2023
还要验证 POI 的 WorkbookFactory 所依赖的 jar 所依赖的任何内容,无论是直接还是间接的,是否也包括在内。在我对 Apache POI 的使用中,我包括了 Apache xmlbeans、Apache commons compress、Apache 集合和一些额外的 POI jar。您可能需要其中的一个子集。
1赞 Holger 11/2/2023
您可能在添加库之前运行了该软件。在这种情况下,Eclipse 创建了一个运行配置,当您更改构建路径时,该配置不会更新。如果未自定义它,只需删除运行配置(“MainClass (1)”),然后再次运行。然后,Eclipse 创建一个新的运行配置,从当前构建路径派生 clas 路径。
0赞 M. Justin 11/2/2023
欢迎来到 Stack Overflow!这个问题在回答之前需要以下细节:你如何运行应用程序(例如命令行、Gradle、Eclipse等),你从中获取JAR的实际站点URL,堆栈跟踪和Java类的非图像版本(即粘贴到问题的代码中)。目前,该问题无法被其他人重现,并且它违反了 Stack Overflow 要求,即代码是文本,而不是图像。
1赞 Sam 11/2/2023
Tx @M.Justin 发表评论。我按照建议更新了我的帖子。
1赞 Sam 11/2/2023
最终,我找到了解决方案。在构建路径中,我必须将 JAR 从 ModulePath 移动到 ClassPath。然后我添加了更多 JAR:commons-collections、commons-compress、commons-io、log4j-api、log4j-core、xmlbeans 和一些额外的 POI JAR。感谢大家的贡献。

答: 暂无答案