如何避免Apache POI中的java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.copy(Ljava / io / InputStream; Ljava / io / OutputStream;)

问题描述 投票:14回答:7

我有一个代码,用于将水印添加到现有的.doc文件中。

以下是我到目前为止尝试过的代码

public static void main(String[] args)
{

    try
    {
        XWPFDocument xDoc = new XWPFDocument(new FileInputStream("test.doc"));
        XWPFHeaderFooterPolicy xFooter = new XWPFHeaderFooterPolicy(xDoc);
        xFooter.createWatermark("My Watermark");
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

以下是我得到的

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)V
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:50)
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:71)
at com.avi.Test.ReadDoc.main(Watermark.java:38)
java apache-poi doc
7个回答
28
投票

我今天收到了这个错误:“java.lang.NoSuchMethodError:org.apache.poi.util.POILogger.log(I [Ljava / lang / Object;)V]”

它看起来与您的错误不同,但非常相似。仅供参考,我正在使用maven来管理罐子。经过一些实验,我发现根案例是poi.jar和poi-ooxml.jar的版本不一致。

此配置将出错:

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.12</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.13</version>
    </dependency>

我将poi.jar的版本从3.12更改为3.13

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.13</version>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.13</version>
    </dependency>

宾果游戏,问题解决了。我希望这会帮助遇到这种异常的人。


6
投票

Apache POI FAQ entry on this very topic。几乎可以肯定的是,你已经在你的类路径中添加了一个新的POI副本,但旧的版本已经存在(来自早期的需求,你的框架等),Java现在对使用哪一个感到困惑。

首先,您需要使用这样的代码片段来确定POI的来源:

ClassLoader classloader =
   org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
         "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("Core POI came from " + path);

用它来识别旧罐子并将其移除。

然后,使用POI Components Page来计算出你需要使用的Jars,以及它们的依赖关系。最后,将最新的罐子添加到您的类路径中,您将会很高兴!


2
投票

您几乎肯定在类路径上有旧版本的POI。

The Apache POI FAQ


1
投票

去这里:http://poi.apache.org/download.html

下载tar.gz - >解压缩并从构建classPath中添加所有jar。


1
投票

对齐'poi'和'poi-ooxml'的pom版本,它将完成工作

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
</dependencies>

0
投票

我遇到了和你一样的问题,解决方案是你需要导入所有jar文件来运行你的程序。这些是运行你的项目所必需的

  • 点3.10,phainalajara
  • POI-OOXML-3.10-Final.jar
  • POI-OOXML架构 - 3.10.jar
  • XMLBeans的-2.30.jar

0
投票

从一开始,poi-ooxml和poi版本必须相同。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version> <---------------this.
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version> <---------------this.
</dependency>

0
投票

我有一个与apache Tika类似的问题(java.lang.NoSuchMethodError错误):javax.servlet.ServletException:java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.closeQuietly(Ljava / io / Closeable;)

我通过更新POI罐解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.