如何在为doc文件使用POI时解决NoSuchMethodError

时间:2012-07-11 00:20:53

标签: java apache-poi

当我尝试实现以下

的任何代码时
File someFile = new File("D:\\arz.doc");
InputStream inputStrm = new FileInputStream(someFile);
HWPFDocument wordDoc = new HWPFDocument(inputStrm);
System.out.println(wordDoc.getText());

或:

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("D:\\arz.doc"));
WordExtractor extractor = new WordExtractor(fs);
String wordText = extractor.getText();

,错误消息总是如下:

Exception in thread “main” java.lang.NoSuchMethodError:            
org.apache.poi.poifs.filesystem.POIFSFileSystem.getRoot()Lorg/apache/poi/poifs/filesystem/DirectoryNode;
at org.apache.poi.hwpf.HWPFDocument.(HWPFDocument.java:186)
at DB_connect.dissertation_araalz.ParseWodDocFile.main(ParseWodDocFile.java:29)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

你可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:10)

您几乎肯定在类路径上有两个POI副本。一个是新的最新版本,其中包含您要使用的功能。另一个是没有的旧版本,而且你的系统似乎更喜欢较旧版本......

POI FAQ Covers this very case这是一个很常见的问题。理想情况下,只需查看您的类路径,并尝试识别额外的旧POI jar。但是,如果这不起作用,请尝试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);

这将打印出您正在使用的POI jar的文件名,这样您就可以找出旧版本的来源并将其删除!

答案 1 :(得分:0)

正如@Gagravarr指出的那样,请尝试将所有poi库的版本更改为通用版本。 我用相同的方式修复它。