web-dev-qa-db-ja.com

Apache POIでJava.lang.NoSuchMethodError:org.Apache.poi.util.IOUtils.copy(Ljava / io / InputStream; Ljava / io / OutputStream;)を回避する方法

既存の.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)
14
Avinash

今日このエラーが発生しました:「Java.lang.NoSuchMethodError:org.Apache.poi.util.POILogger.log(I [Ljava/lang/Object;)V]」

エラーとは異なりますが、よく似ています。参考までに、私はjarの管理に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>

ビンゴ、問題は解決しました。これがこの種の例外に遭遇した人に役立つことを願っています。

28
sofia

Apache POI FAQこのトピックに関するエントリ を参照してください。ほぼ確実に起こったことは、クラスパスに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);

それを使用して古いjarを特定し、削除します。

次に、 POIコンポーネントページ を使用して、使用する必要があるJARとその依存関係を調べます。最後に、最新のjarをクラスパスに追加すれば、準備完了です。

6
Gagravarr

ほとんど確実に、クラスパスに古いバージョンのPOIがあります。

参照 Apache POI FAQ

2
M. Abbas

ここに移動: http://poi.Apache.org/download.html

tar.gzをダウンロード->抽出し、そこからすべてのjarをビルドクラスパスに追加します。

1
Xelian

'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>
1
Ziv.Ti

最初から、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
Tiina

Apache Tika(Java.lang.NoSuchMethodError Error)で同様の問題が発生しました:javax.servlet.ServletException:Java.lang.NoSuchMethodError:org.Apache.poi.util.IOUtils.closeQuietly(Ljava/io/Closeable;)

POI jarを更新して問題を解決しました。

0
user26316

私と同じ問題が発生しました。解決策は、プログラムを実行するためにすべてのjarファイルをインポートする必要があることです。これらはプロジェクトの実行に必須です。

  • Poi-3.10-Final.jar
  • Poi-ooxml-3.10-Final.jar
  • Poi-ooxml-schemas-3.10.jar
  • Xmlbeans-2.30.jar
0
venkyreddy