如何避免apache poi中的java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)
我有一个向现有的.doc文件添加水印的代码 以下是我迄今为止尝试过的代码如何避免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);
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
<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:-)