2013-08-14 28 views
9

Mam kod dodawania znaku wodnego do istniejącego. plik doc.Jak uniknąć java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy (Ljava/io/InputStream; Ljava/io/OutputStream;) w Apache POI

Poniżej znajduje się kod Próbowałem tak daleko

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

Oto co mam

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

Sprawdź wersję swoich słoików, mieszaj różne wersje. Googling dla "org.apache.poi.util.IOUtils" powie Ci, który jar go zawiera, i przy której wersji została wprowadzona metoda 'copy (InputStream, OutputStream)'. – SJuan76

Odpowiedz

0

Prawie na pewno masz starszą wersję POI na ścieżce klas.

Zobacz The Apache POI FAQ

+1

Mam 'poi-ooxml-3.5-final.jar',' xbean.jar' na moim classpath – Avinash

6

Zobacz Apache POI FAQ entry on this very topic. Prawie na pewno zdarzyło się, że dodałeś nową kopię POI do swojej ścieżki klas, ale starsza wersja już tam istniała (od wcześniejszej potrzeby, twojej struktury itp.), A Java zaczyna się zastanawiać, której z nich użyć.

Po pierwsze, będziemy chcieli użyć fragmentu kodu jak to wypracować gdzie POI pochodzi z:

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

używać, aby zidentyfikować starszą słoik (S) i usuń je.

Następnie użyj POI Components Page, aby ustalić, jakie słoiki potrzebujesz i jakie są ich zależności. Na koniec dodaj ostatnie słoiki do swojej ścieżki klas, a będziesz gotowy do pracy!

+0

Mam 'poi-ooxml-schemas-3.7.jar'' poi-ooxml-3.7.jar', 'xbean. jar'. Teraz coraz : 'Wyjątek w wątku "main" java.lang.NoClassDefFoundError: org/apache/POI/util/POILogFactory \t w org.apache.poi.POIXMLDocumentPart. (POIXMLDocumentPart.java:40) \t w com.avi.Test.ReadDoc.main (ReadDoc.java:46) spowodowane przez: java.lang.ClassNotFoundException: org.apache.poi.util.POILogFactory \t w Java .net.URLClassLoader $ 1.run (Unknown Source) \t na java.net.URLClassLoader.findClass (Unknown Source) \t na java.lang.ClassLoader.loadClass (Unknown Source) ' – Avinash

+1

mieć kolejne spojrzenie na stronie [Components] (http://poi.apache.org/overview.html#components), który jasno stwierdza, że ​​poi-ooxml zależy od poi, więc musisz dodać także ten słoik. Ponadto, 3.7 jest stary, rozważ nowszą wersję! – Gagravarr

0

Mam takie same problemy jak ty, rozwiązanie jest konieczne, aby zaimportować wszystkie pliki jar do uruchomienia program.These są obowiązkowe dla uruchomiony projekt

  • Poi-3,10-Final.jar
  • Poi -ooxml-3,10-Final.jar
  • POI-OOXML-schematy-3.10.jar
  • XMLBeans-2.30.jar
15

mam ten błąd dzisiaj: "java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log (I [Ljava/lang/Object;) V]"

To wygląda inaczej twój błąd, ale całkiem podobny. FYI, używam maven do zarządzania słoikami. Po pewnym eksperymencie odkryłem, że głównym przypadkiem jest wersja poi.jar, a wersja poi-ooxml.jar nie jest spójna.

Taka konfiguracja będzie się błąd:

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

Zmieniłem wersję poi.jar od 3,12 do 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, problem rozwiązany. Mam nadzieję, że to pomoże komuś, kto spotkał się z tego rodzaju wyjątkami.

+0

[Najczęściej zadawane pytania na temat POI Apache jest całkiem jasne] (http://poi.apache.org/faq.html#faq-N1019C), że mieszanie słoików POI między wersjami nie jest obsługiwane, więc w dużej mierze można się tego spodziewać! – Gagravarr

+0

Nie miksowałem wersji, ale aktualizacja z 3.10.1 do 3.13 (konsekwentnie) działała dla mnie w każdym razie. Gdzie 3.15 (obecnie ostatnia stabilna) spowodowało inne błędy. – Simon

+0

Dzięki, uratowałeś mi dzień. – Bin

0

Od samego początku wersje poi-ooxml i poi muszą być identyczne.

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