【问题标题】:Eclipse throwing ClassNotFoundException despite me having added the proper Apache POI .jar File?尽管我添加了正确的 Apache POI .jar 文件,Eclipse 仍抛出 ClassNotFoundException?
【发布时间】:2025-11-30 16:00:01
【问题描述】:

我正在使用 servlet 将 .xls(Excel 电子表格)文件上传到服务器。我将 Apache FileUpload API 用于业务逻辑的上传部分,为了确保这部分正常工作,我已成功尝试将 .txt 文件上传到 Servlet,之后 - Apache FileUpload API,来自 servlet 端给我一个InputStream,我从中将.txt的所有内容打印到控制台上。

不起作用的部分是,当我尝试使用该InputStream 并将其转发到一种方法时,我扫描用户上传的.xls 文件并将其打印在控制台上。抛出的异常是:

java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.WorkbookFactory

尽管我在 Java 项目构建路径中添加了 poi-3.5-FINAL-20090928.jarpoi-ooxml-3.5-FINAL-20090928.jar,但还是会发生这种情况。应该提到的是后一个文件包含WorkbookFactory 类。

然而,当我尝试扫描本地存在于硬盘驱动器上的 .xls 文件时,我从中派生了 InputStream 并将其转发以打印 .xls 的所有单元格,它会打印出控制台上的每一行和每一列都完美无缺。有什么解决办法吗?

【问题讨论】:

  • 当您扫描“本地存在”文件时,您是否在同一进程/类路径下运行?
  • 另外,在您扫描之前,执行 System.out 或 Class.forName("org.apache.poi.ss.usermodel.WorkbookFactory") 的日志,并查看该类是否存在于类路径。

标签: java inputstream apache-poi


【解决方案1】:

您正在使用 Apache Commons FileUpload,这意味着您正在使用 Web 应用程序。您是否将这些库放在 webapp 的 /WEB-INF/lib 文件夹中,就像您通常应该为任何第 3 方库所做的那样?您不需要对 Java 项目构建路径做任何事情。 Eclipse 将自动在构建路径中获取 /WEB-INF/lib 中的任何库,并且 Web 应用程序一旦部署,默认情况下将在类路径中获取这些库。

如果这没有帮助,请确保您在类路径中没有其他地方的旧版本 POI,这可能会在类加载中卷曲。这包括除了每个应用服务器的/lib 下的webapp 的/WEB-INF/lib(可能还有其他,取决于make/version/configuration,请参阅文档以获取详细信息)和JRE 的/lib。如果那里有旧的 POI 版本,您需要先删除它们。实际上,这些文件夹不应包含任何 3rd 方 webapp 特定的库,它只会使类路径混乱。

【讨论】:

    【解决方案2】:

    解决方案非常简单:

    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 如果这能解决您的问题,请告诉我。

    【讨论】:

      最近更新 更多