什么会导致java.lang.NoClassDefFoundError错误?

9
我想要读取Excel文件,但是出现了问题。
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject
 at ExcelReader.main(ExcelReader.java:32)
Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlObject
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)
... 1 more

请帮助我。 首先打开.xlsx文件,然后给出第一个表格。 最后在控制台上打印excel文件的数据。 提示:我已经将poi-ooxml-3.9-20121203.jar添加到我的项目中。

    import java.io.File;
    import java.io.FileInputStream;
    import javax.swing.text.html.HTMLDocument.Iterator;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import java.util.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    /**
     * @author mohammad hosein
    *
    */
    public class ExcelReader {

/**
 * @param args
 */
public static void main(String[] args) {
    try
    {
    FileInputStream file = new FileInputStream(new File("E:\\test.xlsx"));

    //Get the workbook instance for XLS file 
    XSSFWorkbook workbook = new XSSFWorkbook (file);

    //Get first sheet from the workbook
    XSSFSheet sheet = workbook.getSheetAt(0);

    //Get iterator to all the rows in current sheet
    java.util.Iterator<Row> rowIterator = sheet.iterator();

    while(rowIterator.hasNext())
    {
        Row row = rowIterator.next();
        java.util.Iterator<Cell> cellIterator = row.cellIterator();

        while(cellIterator.hasNext())
        {
            Cell cell = cellIterator.next();
            System.out.print(cell.getStringCellValue() + "\t");
        }
        System.out.println("");
    }
    }
    catch(Exception e)
    {
        System.out.println("EROR!");
    }

    //Get iterator to all cells of current row

}

}


1
请问您能否发布错误堆栈跟踪? - Rohan
请发布您的“异常”代码片段。 - kark
请使用搜索功能。这个问题已经被问了数百甚至数千次。 - Woot4Moo
可能是令人恐惧的java.lang.NoClassDefFoundError 的重复问题,https://dev59.com/sXE95IYBdhLWcg3wm_Mu在Eclipse中出现奇怪的java-lang-noclassdeffounderror,https://dev59.com/x1bTa4cB1Zd3GeqP6wEm - Woot4Moo
12个回答

14

您的代码不相关。 NoClassDefFoundError 表示在运行时找不到编译时可用的类。如果您提供了完整的堆栈跟踪和未找到的类的实际名称,可能可以提供更精确的建议。

通常情况下,这会发生在您使用与构建代码所使用的JAR版本不同的版本来运行代码时。来自应用程序容器或类似容器的恶意JAR文件可能会被放置在类路径中比正确的JAR文件更靠前的位置。

更新

根据您添加的堆栈跟踪,您缺少 Apache POI 的传递依赖项:XMLBeans。您在运行时可能会缺少此 JAR 文件。这完全取决于您如何运行项目。


5

我认为你忘记了在项目属性中勾选库。

  1. 右键点击你的项目 --> 选择属性
  2. 选择Java构建路径
  3. 选择对象和导出选项卡
  4. 然后选择你添加的库。
  5. 确定后再次运行你的项目。

导出依赖项与此有什么关系?只有在您使用其他项目依赖的项目时,导出的依赖项才相关。它不会导致运行时错误,而是在编译时失败。 - Marko Topolnik
我检查过了,但它没有用。 - sharafi

4
当未添加所有必需的poi jar文件时,就会发生这种情况。因此,我的建议是添加所有必需的jar文件。将lib和ooxml-lib文件夹中的jar文件以及poi-3.15-beta2 jar文件一起添加。 如何添加jar:
  1. 右键单击项目
  2. Buildpath>ConfigureBuildpath
  3. 库选项卡
  4. 添加外部jar文件

你的回答帮了我很多。 - Kusum

1

1
Apache POI文档提供了不同组件及其依赖关系的完整列表。您表示想要使用poi-ooxml,但似乎错过了xmlbeans依赖项(也可能有其他依赖项!)。请参阅组件页面以获取所有详细信息。
如果您下载Apache POI的二进制发行版,则会发现您可能需要的所有依赖项都方便地包含在软件包中。只需添加所需的依赖项即可。
如果您觉得所有这些手动操作有点困难,请使用类似于Apache MavenApache Ivy的工具来管理您的依赖项。
接下来,您需要两次获得所有这些JAR文件。一次用于编译,一次用于运行。仅在Eclipse或类似软件中拥有这些JAR文件可能不足够,您还需要将它们放入生产环境中!

0

正如其名称所示,Java中的ClassNotFoundExceptionjava.lang.Exception的子类,并且在Java虚拟机尝试加载特定类并在类路径中找不到请求的类时出现。

关于此异常的另一个重要点是,它是一个已检查的异常,在使用可能会抛出ClassNotFoundException的方法时,您需要显式提供异常处理,可以通过使用try-catch块或使用throws子句来实现。

Oracle文档

public class ClassNotFoundException
 extends ReflectiveOperationException

当应用程序尝试通过其字符串名称使用以下方法之一加载类时抛出:

  • Class类中的forName方法。
  • ClassLoader类中的findSystemClass方法。
  • ClassLoader类中的loadClass方法。

但找不到指定名称的类的定义。

poi-ooxml-schemas-3.9-20121203.jar文件添加到类路径中以避免异常。
您可以在以下链接中找到:

  1. apache
  2. get jar

编辑

你缺少了POI的附带jar文件,需要将它们包含在你的类路径中。
你需要包含一个名为xmlbeans-x.x.x.jar的jar文件。点击此处获取jar文件
XMLBeans


我添加了这个,但并没有什么用处。 - sharafi
@sharafi:请查看我的更新答案。希望这能解决你的问题。 - Aniket Kulkarni

0

poi-3.9附带了2个重要的jar文件,需要将它们包含进来,因为XSSFWorkbook会使用它们。

xmlbeans*.jar dom4j-*.jar

这两个 jar 文件都位于 ooxml-lib 文件夹中,是 poi-3.9*.zip 的一部分。 将它们包含在你的库中,这应该可以解决问题。


0

NoClassDefFoundError会在编译时存在一个类,但在运行时Java类路径中不可用时出现。通常,当您遇到NoClassDefFoundError时,日志中会显示以下行:

此网站提供了所有关于为什么会出现此错误的原因以及解决此问题的3种方法。


0

通常情况下,当所需的jar文件不可用时,会出现NoClassDefFoundError异常。

请检查以下条件

  1. 检查您默认添加的poi-ooxml-3.9-20121203.jarJar文件路径
  2. 完全检查是否需要任何其他附加的jar文件,在编译时程序可能需要您未导入的任何类文件

  3. 需要poi-3.7-jdk1.4-20110508-rc2 jar文件。


0

我刚遇到了同样的问题。 我通过将整个文件夹添加到库中(使用Netbeans)来添加\ooxml-lib\文件夹中的JAR文件。 我将其删除并手动添加每个JAR文件,然后它就可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接