2013-08-14 1 views
9

J'ai un code pour ajouter un filigrane à existant. fichier doc.Comment éviter java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy (Ljava/io/InputStream; Ljava/io/OutputStream;) dans POI Apache

Voici le code que je l'ai essayé jusqu'à présent

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(); 
    } 
} 

Voici ce que j'ai

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) 
+2

Vérifiez la version de vos pots, vous mélangez différentes versions. Googling pour 'org.apache.poi.util.IOUtils' vous dira quel jar le contient, et à quelle version une méthode' copy (InputStream, OutputStream) 'a été introduite. – SJuan76

Répondre

0

Vous avez certainement une ancienne version de POI sur votre classpath.

Voir The Apache POI FAQ

+1

J'ai 'poi-ooxml-3.5-final.jar',' xbean.jar' sur mon chemin de classe – Avinash

6

Voir la Apache POI FAQ entry on this very topic. Ce qui est presque certainement arrivé est que vous avez ajouté une nouvelle copie de POI à votre classpath, mais une version plus ancienne était déjà là (d'un besoin plus tôt, votre cadre etc.), et Java est maintenant confus au sujet de celui à utiliser.

Tout d'abord, vous aurez envie d'utiliser un extrait de code comme celui-ci pour déterminer où POI vient:

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); 

utiliser pour identifier le pot ancien (s) et retirez-les.

Ensuite, utilisez le POI Components Page pour déterminer les fichiers JAR que vous devez utiliser et leurs dépendances. Enfin, ajoutez les derniers jars à votre classpath, et vous serez prêt à partir!

+0

J'ai 'poi-ooxml-schemas-3.7.jar'' poi-ooxml-3.7.jar', 'xbean. jar'. Maintenant obtenir: 'Exception dans le thread "principal" java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory \t à org.apache.poi.POIXMLDocumentPart. (POIXMLDocumentPart.java:40) \t à com.avi.Test.ReadDoc.main (ReadDoc.java:46) causés par: java.lang.ClassNotFoundException: org.apache.poi.util.POILogFactory \t à java .net.URLClassLoader 1.run $ (Source inconnue) \t à java.net.URLClassLoader.findClass (Source inconnue) \t à java.lang.ClassLoader.loadClass (Source inconnue) ' – Avinash

+1

Présentons à la [page composants] (http://poi.apache.org/overview.html#components), qui indique clairement que poi-ooxml dépend de poi, donc vous devez ajouter ce pot aussi. De plus, 3.7 est vieux, considérez une version plus récente! – Gagravarr

0

je suis arrivé mêmes problèmes comme vous, la solution est que vous devez importer tous les fichiers jar pour exécuter vos program.These sont obligatoires pour l'exécution de votre projet

  • Poi-3,10-Final.jar
  • Poi -ooxml-3,10-Final.jar
  • Poi-OOXML-schémas-3.10.jar
  • XMLBeans-2.30.jar
1

Rendez-vous ici: Téléchargez le fichier tar.gz -> extrayez-le et ajoutez-y tous les fichiers jar à la classe de construction buildPath.

15

J'ai eu cette erreur aujourd'hui: "java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log (I [Ljava/lang/Object;) V]"

Il est différent de votre erreur, mais assez similaire. Pour info, j'utilise maven pour gérer les pots. Après quelques expériences, j'ai découvert que le cas racine est la version poi.jar et poi-ooxml.jar ne sont pas compatibles.

Cette configuration obtiendrez une erreur:

<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> 

j'ai changé la version de poi.jar à partir 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> 

bingo, le problème est résolu. J'espère que cela aidera quelqu'un qui a rencontré ce genre d'exception.

+0

La [FAQ POI Apache est assez claire] (http://poi.apache.org/faq.html#faq-N1019C) que le mélange de jacks POI entre les versions n'est pas supporté, donc c'est largement prévisible! – Gagravarr

+0

Je n'ai pas mélangé les versions, mais une mise à jour de 3.10.1 à 3.13 (toujours) a fonctionné pour moi de toute façon. Où 3.15 (actuellement la dernière stable) a causé d'autres erreurs. – Simon

+0

Merci, vous avez sauvé ma journée. – Bin

0

Dès le début, les versions poi-ooxml et poi doivent être identiques.

<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>