首页 文章

java.lang.NoSuchMethodError:org.apache.poi.xssf.usermodel.XSSFWorkbook . <init>(Ljava / io / InputStream;)V

提问于
浏览
1

我在我的类路径中包含了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)

2 回答

  • 0

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

    所以,你需要在运行时检查你的类路径,如果_2445900错误的话,可以在_2445899的帮助下查看你的类路径,然后删除不匹配的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)

  • 1

    正如异常所示,即使您包含该方法所在的版本,构建也会考虑该方法不存在的旧版本 . 要测试它,请检查您的maven依赖关系树并删除旧版本 . 旧版本也可能从容器中传出,因此请正确检查 .

相关问题