【问题标题】:NoClassDefFound ExceptionNoClassDefFound 异常
【发布时间】:2012-11-22 21:22:39
【问题描述】:

我正在使用 apache poi 打开现有的 excel 文件。

public static int generateReport(Calendar csdate,Calendar cedate) throws Exception
{
     FileInputStream fileIn =null;
     FileOutputStream fileOut = null;
     int sum=0;//For calculating the total number of tickets
    final Workbook wb;
    fileIn =new FileInputStream("d:\\excelfiles\\TicketsReport.xlsm");
    wb = org.apache.poi.ss.usermodel.WorkbookFactory.create(fileIn);<-- Exception
    final Sheet sheet = wb.getSheet("Report");
    //rest of stuff
}

我有一个 servlet,它从 html 页面获取日期并调用 generateReport()。问题是这个程序之前运行的是相同的tomcat 6 版本和servlet2.4 版本。在 Eclipse 中,WorkbookFactory.create() 行没有编译时错误。这是堆栈跟踪。

java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/WorkbookFactory
at ReportFromJira.generateReport(ReportFromJira.java:59)
at JiraReportServlet.doPost(JiraReportServlet.java:52)
at JiraReportServlet.doGet(JiraReportServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Unknown Source)

当我手动浏览 jar 文件时,我发现了这一点。

poi-3.8-20120326.jar contains
org.apache.poi.ss.usermodel->Workbook.class file

and poi-ooxml-3.8-20120326.jar contains
org.apache.poi.ss.usermodel->WorkbookFactory.class file

我的类路径中包含两个 jar 文件。

知道为什么会出现异常吗?

【问题讨论】:

  • 似乎你把它们放在你的类路径中是错误的,它们必须在你的 tomcat 类路径中,而不仅仅是 Eclipse 类路径。建议手动将其中一个 jar 放入 WEB-INF/lib 中。
  • 参见otherquestions关于如何调试类加载。
  • @MozenRath :我认为你是正确的发布答案,以便我可以接受它

标签: java servlets apache-poi


【解决方案1】:

org.apache.poi.ss.usermodel.WorkbookFactory 包含在poi-ooxml jar 文件中。为了使用它,您需要核心 POI jar、POI OOXML jar 及其依赖项。您遇到的异常表明您至少缺少其中一项。

您可以在Apache POI Components page 上找到有关内部和外部不同 POI 组件的依赖关系的更多信息。我建议您查看一下,查看您的应用程序并构建,然后放入您缺少的 jar 中!

【讨论】:

  • 并使用 maven 或 gradle 的 ivy 或其他管理依赖项的构建工具。
  • Apache POI 在 Maven Central 中完全可用,以及它的所有依赖项。从长远来看,切换到 maven/ivy/gradle 是明智的,但可能不是解决这个问题的先决条件!
  • 我有两个 jar 文件。问题中提到了
  • 不,你认为你已经包含了罐子,但你显然没有因此错误......你需要确保罐子(及其依赖关系!)编译时运行代码时都可用
  • @Gagravarr:现在我确定我已经包含了两个 jar 文件
【解决方案2】:

只需将其中一个 jar 放在 WAR\EAR 的 WEB-INF\lib 中,因为这是 Tomcat 默认从中挑选 jar 的位置。

当通过eclipse配置没有运行tomcat时,仅仅包括在eclipse项目中是不够的。

【讨论】:

    【解决方案3】:

    解决方法很简单:

    1. 下载此链接http://archive.apache.org/dist/poi/release/bin/poi-bin-3.9-20121203.zip中的所有jar文件
    2. 解压文件并将所有 jar 文件复制到项目中的“\WebContent\WEB-INF\lib\”。请注意:您必须在 ECLIPSE 中将其复制并粘贴到您的项目中,不要通过 Windows 资源管理器复制粘贴或将其作为外部 JAR 放置在 java 构建路径中,因为它永远不会起作用。

    就是这样,你完成了.. :D 如果这能解决您的问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2016-02-02
      相关资源
      最近更新 更多