【问题标题】:java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(Ljava/io/InputStream;)Vjava.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(Ljava/io/InputStream;)V
【发布时间】:2015-03-20 11:23:48
【问题描述】:

我在我的类路径中包含了 dom4j-1-6.jar、poi 3.9 jar、poi ooxml schemas 3.9 jar、poi ooxml 3.9 jar、xmlbeans-2.3.0.jar。我使用了如下语法

InputStream ExcelFileToRead = new FileInputStream(relative+"/"+docName);
         XSSFWorkbook  wb_hssf  = new XSSFWorkbook(ExcelFileToRead);

我收到以下错误,

java.lang.NoSuchMethodError: org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(Ljava/io/InputStream;)V
    at com.admin.upload_images.doPost(upload_images.java:1057)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

    标签: java apache-poi import-from-excel


    【解决方案1】:

    有一个Apache POI FAQ entry covering virtually this case,您应该阅读它。基本上,在运行时,您并没有使用您编译的 POI jar。相反,您以某种方式使用了不同的版本。这可能是因为您部署了不同的 jar,也可能是因为您的运行时或容器或框架运送了其他 POI jar,或者其他一些错误。根据this POI FAQ,所有 POI jar 也必须来自同一版本。

    因此,您需要在运行时检查您的类路径,如果您无法发现问题所在,请借助 snippet from the FAQ,然后删除不匹配的 POI jar,这样您就只有在编译时使用的那些.然后你的代码就可以工作了

    但是...您的代码还有一些其他问题!一个是当你有一个文件时你正在使用一个 InputStream。这一点,因为explained in the Apache POI docs 很糟糕,因为它使用了更多的内存。将其更改为使用文件,例如使用此

    Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));
    

    其次,Apache POI 3.9 现在有点老了,已经有a huge number of bug fixes since then,所以你应该升级到最新版本(截至发稿时为 3.11 或 3.12 beta 1)

    【讨论】:

    • 我在包含 BIRT 时遇到了这个异常。当我使用 POI 3.13.0 构建框架时,我意识到 BIRT (4.5.0) 会消耗 POI (3.9.0)。
    【解决方案2】:

    正如异常所暗示的那样,即使您包含该方法存在的版本,构建也会考虑使用该方法不存在的旧版本。要对此进行测试,请检查您的 Maven 依赖关系树并删除旧版本。也可能是旧版本也来自容器,因此请正确检查。

    【讨论】:

    • ,我已经删除了所有旧版本的jar。我已经检查了。
    • 如果你使用 Eclipse,在类上按 F3 可以显示 jar 路径。检查版本是否正确。
    • 我只使用 NetBeans IDE @Raghuveer
    • 所以如果你对它感到满意,那么看看那个类的 jar 存在哪里
    • 一旦你得到了哪个版本,就解压jar,看看jar中是否存在上述类文件,以及使用JDGUI工具的方法(如果没有,请下载)来自jd.benow.ca/jd-gui/downloads/jd-gui-0.3.6.windows.zip
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多