什么给java.lang.NoClassDefFoundError?

时间:2013-09-20 12:04:25

标签: java excel apache-poi

我想阅读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文件的数据。 Ps:我在我的项目中添加了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

}

}

11 个答案:

答案 0 :(得分:12)

您的代码无关紧要。当编译时可用的类在运行时不可用时,会发生NoClassDefFoundError。如果您提供了完整的堆栈跟踪,以及未找到的类的实际名称,则可以提供更精确的建议。

通常,当您使用与构建代码的JAR不同版本的JAR运行代码时会发生这种情况。流氓JAR可能来自应用程序容器或类似物,并且比类型JAR更早地放在类路径上。

更新

鉴于您添加的堆栈跟踪,您缺少Apache POI的传递依赖关系:XMLBeans。您可能在运行时缺少此JAR。这一切都取决于您运行项目的具体程度。

答案 1 :(得分:4)

我想你忘了检查Project的财产中的库。

  1. 右键单击您的项目 - &gt;选择物业
  2. 选择Java Build Path
  3. 选择标签对象和导出
  4. 然后选择您添加的库。
  5. 然后再运行你的项目。

答案 2 :(得分:2)

当没有添加所有必需的poi jar文件时会发生这种情况。所以我的建议是添加所有必需的jar文件。在lib和ooxml-lib文件夹中添加jar文件以及poi-3.15-beta2 jar文件。 如何添加jar

  1. 右键单击项目
  2. 的Buildpath&GT; ConfigureBuildpath
  3. “库”标签
  4. 添加外部jar文件

答案 3 :(得分:1)

Apache POI文档提供了a full list of the different components and their dependencies。您声明要使用poi-ooxml,但您似乎错过了xmlbeans依赖关系(也许还有其他人!)。有关所有内容的详细信息,请参阅components page

如果您下载binary release of Apache POI,那么您将找到您可能需要随手包含的所有依赖项。只需添加您需要的那些。

如果所有这些手册对您来说都有点困难,请使用Apache MavenApache Ivy之类的内容来管理您的依赖项。

接下来,你需要两次可用的所有罐子。一次编译,一次运行。只是让日食或类似的罐子可能还不够,你还需要让它们进入你的生产环境!

答案 4 :(得分:1)

确保您在库中添加了“commons-collections.jar”文件,否则从此处下载所有库文件:

http://www-us.apache.org/dist/poi/release/bin/poi-bin-3.16-20170419.zip

在zip文件中打开后打开“lib”文件夹,你会发现需要在项目库中添加的common-collectins.jar文件,如附图所示:

Image shows all necessary libraries

答案 5 :(得分:0)

如果一个类在编译期间出现但在运行时期间在java类路径中不可用,那么

NoClassDefFoundError将会出现。通常,当您获得NoClassDefFoundError:

时,您将在日志中看到以下行

This site为您提供了解决此错误原因的所有理由3种解决方法

答案 6 :(得分:0)

顾名思义,ClassNotFoundException在Java中是java.lang.Exception的子类,当 Java虚拟机尝试加载特定类并且未找到时类路径中请求的类。

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

Oracle docs

public class ClassNotFoundException
 extends ReflectiveOperationException

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

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

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

poi-ooxml-schemas-3.9-20121203.jar文件添加到类路径以避免异常 你会在这些链接上找到

  1. apache
  2. get jar
  3. 修改

    您错过了POI附带的额外jar文件。将它们包含在您的课程路径中 你需要包含一个名为xmlbeans-x.x.x.jar的jar文件 get jar here
    XMLBeans

答案 7 :(得分:0)

当所需的jar不可用时,通常会发生NoClassDefFoundError exception

检查以下条件

  1. 默认情况下检查您添加的Jar file path poi-ooxml-3.9-20121203.jar
  2. 在编译时完全检查是否需要任何额外的jar 程序可能需要您尚未导入的任何类文件

  3. poi-3.7-jdk1.4-20110508-rc2 jar是必需的。

答案 8 :(得分:0)

有两个重要的jar文件与poi-3.9一起提供,需要包含在XSSFWorkbook中使用它们

的xmlbeans的* .jar DOM4J - *罐

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

在构建路径中添加xmlbeans-2.3.0.jar。这是xlsx所必需的。