2013-08-14 10 views
9

Ho un codice per aggiungere la filigrana a esistente. file doc.Come evitare java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy (Ljava/io/InputStream; Ljava/io/OutputStream;) in Apache POI

Quello che segue è il codice che ho provato finora

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

Quello che segue è quello che ho ottenuto

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

Controlla la versione dei tuoi vasi, stai mescolando diverse versioni. Googling per 'org.apache.poi.util.IOUtils' ti dirà quale jar lo contiene, ea quale versione è stato introdotto un metodo' copy (InputStream, OutputStream) '. – SJuan76

risposta

0

Quasi certamente avete una versione precedente di POI sul classpath.

Vedi The Apache POI FAQ

+1

Ho 'poi-ooxml-3.5-final.jar',' xbean.jar' sul mio classpath – Avinash

6

Vedere le Apache POI FAQ entry on this very topic. Quello che è quasi certamente successo è che hai aggiunto una nuova copia di POI al tuo classpath, ma una versione precedente era già lì (da una precedente necessità, il tuo framework ecc.) E Java ora si sta confondendo su quale usare.

In primo luogo, ti consigliamo di utilizzare un frammento di codice come questo per capire dove PDI è venuta da:

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

Usa che per identificare il vaso vecchio (s) e rimuoverli.

Quindi, utilizzare POI Components Page per determinare quali jar è necessario utilizzare e quali sono le loro dipendenze. Infine, aggiungi gli ultimi vasi al tuo classpath e sarai pronto per partire!

+0

Ho 'poi-ooxml-schemas-3.7.jar'' poi-ooxml-3.7.jar', 'xbean. jar'. Ora ottenere: 'Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/PDI/util/POILogFactory \t a org.apache.poi.POIXMLDocumentPart. (POIXMLDocumentPart.java:40) \t a com.avi.Test.ReadDoc.main (ReadDoc.java:46) causato da: java.lang.ClassNotFoundException: org.apache.poi.util.POILogFactory \t a Java .net.URLClassLoader $ 1.run (Fonte sconosciuta) \t a java.net.URLClassLoader.findClass (fonte sconosciuta) \t a java.lang.ClassLoader.loadClass (Fonte sconosciuta) ' – Avinash

+1

avere un altro sguardo al [pagina di componenti] (http://poi.apache.org/overview.html#components), che afferma chiaramente che poi-ooxml dipende da poi, quindi è necessario aggiungere anche quel vaso. Inoltre, 3.7 è vecchio, si consideri una versione più recente! – Gagravarr

0

Ho stessi problemi come voi, la soluzione è è necessario importare tutti i file jar per eseguire le program.These sono obbligatori per l'esecuzione del progetto

  • Poi-3.10-Final.jar
  • Poi -ooxml-3.10-Final.jar
  • Poi-OOXML-schemas-3.10.jar
  • XMLBeans-2.30.jar
15

ho ottenuto questo errore oggi: "java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log (I [Ljava/lang/Object;) V]"

sembra diverso da il tuo errore, ma abbastanza simile. Per tua informazione, sto usando Maven per gestire i barattoli. Dopo qualche esperimento, ho scoperto che il root case è la versione poi.jar e poi-ooxml.jar non sono coerenti.

Questa configurazione otterrà un errore:

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

ho cambiato la versione di poi.jar da 3.12 al 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, problema risolto. Spero che questo possa aiutare qualcuno che si è imbattuto in questo tipo di Eccezione.

+0

Le domande frequenti su [POI Apache sono piuttosto chiare] (http://poi.apache.org/faq.html#faq-N1019C) che non è supportato il mix di giare POI tra le versioni, quindi ci si deve aspettare in gran parte! – Gagravarr

+0

Non ho mescolato le versioni ma un aggiornamento da 3.10.1 a 3.13 (coerentemente) ha funzionato comunque per me. Dove 3.15 (attualmente l'ultima stabile) ha causato altri errori. – Simon

+0

Grazie, mi hai salvato la giornata. – Bin

0

Fin dall'inizio, la versione poi-ooxml e poi deve essere identica.

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