Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免apache poi中的java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)_Java_Apache Poi_Doc - Fatal编程技术网

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

如何避免apache poi中的java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;),java,apache-poi,doc,Java,Apache Poi,Doc,我有一个向现有的.doc文件添加水印的代码 以下是我迄今为止尝试过的代码 public static void main(String[] args) { try { XWPFDocument xDoc = new XWPFDocument(new FileInputStream("test.doc")); XWPFHeaderFooterPolicy xFooter = new XWPFHeaderFooterPolicy(xDoc);

我有一个向现有的.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)
线程“main”java.lang.NoSuchMethodError中的异常:org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)V 在org.apache.poi.util.PackageHelper.open(PackageHelper.java:50) 位于org.apache.poi.xwpf.usermodel.XWPFDocument.(XWPFDocument.java:71) 位于com.avi.Test.ReadDoc.main(Watermark.java:38)
几乎可以肯定,您的类路径上有一个较旧版本的POI

请参阅。几乎可以肯定的是,您已经在类路径中添加了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并移除它们


然后,使用确定您需要使用哪些JAR以及它们的依赖关系。最后,将最新的JAR添加到类路径中,您就可以开始了

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

  • Poi-3.10-Final.jar
  • Poi-ooxml-3.10-Final.jar
  • Poi-ooxml-schemas-3.10.jar
  • Xmlbeans-2.30.jar
到这里:

下载tar.gz->提取它并将所有JAR添加到构建类路径中。

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

它看起来与您的错误不同,但非常相似。仅供参考,我正在使用maven管理JAR。经过一些实验,我发现根案例是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>

org.apache.poi
poi
3.12
org.apache.poi
poi ooxml
3.13
我将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>

org.apache.poi
poi
3.13
org.apache.poi
poi ooxml
3.13

答对了,问题解决了。我希望这将帮助遇到这种异常的人。

从一开始,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>

org.apache.poi
poi ooxml

3.16对齐pom版本的“poi”和“poi ooxml” 它会成功的

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

org.apache.poi
poi
3.17
org.apache.poi
poi ooxml
3.17

我对ApacheTika(java.lang.NoSuchMethodError错误)也有类似的问题:javax.servlet.ServletException:java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.closequilly(Ljava/io/Closeable;)


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

检查JAR的版本,您正在混合不同的版本。搜索
org.apache.poi.util.IOUtils
将告诉您哪个jar包含它,以及在哪个版本引入了
copy(InputStream,OutputStream)
方法。我的类路径上有
poi-ooxml-3.5-final.jar
xbean.jar
,但是仍然得到相同的错误我有
poi-ooxml-schemas-3.7.jar
poi-ooxml-3.7.jar
xbean.jar
。现在,线程“main”java.lang.NoClassDefFoundError:org/apache/poi/util/POILogFactory位于org.apache.poi.POIXMLDocumentPart.(POIXMLDocumentPart.java:40)位于com.avi.Test.ReadDoc.main(ReadDoc.java:46)的异常由以下原因引起:java.lang.ClassNotFoundException:org.apache.poi.util.POILogFactory位于java.net.URLClassLoader$1.run(未知源)位于java.net.URLClassLoader.findClass(未知源)位于java.lang.ClassLoader.loadClass(未知源)< /代码>再看一看,它清楚地表明POI OOXML依赖于POI,所以你也需要添加那个jar。同样,3.7是旧的,考虑一个更新的版本!版本之间的混合POI JAR不支持,所以这是很大的期望!我没有混淆版本,而是从3.101更新到3.13(一致)。反正对我有用。3.15(目前最新的稳定版本)导致了其他错误。谢谢,你救了我一天。为了用另一个提示来完成答案,我在POI版本3.16中遇到了同样的问题,在看到你的答案后,我将所有内容都更改为3.15,所有内容都开始工作。对于3.16,它不工作,所以我将使用3.13(这似乎有效)。因为ApachePOI不知道如何使用maven:-)