2016-08-16 5056 views
0

我正在尝试在Eclipse RCP项目中使用Apache POI库。 所以我添加POI,POI,OOXML和POI-OOXML-架构项目,但还是有一个例外 java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory at org.apache.poi.POIXMLDocumentPart.<clinit>(POIXMLDocumentPart.java:53)NoClassDefFoundError:org/apache/poi/util/POILogFactory

在这一行: XWPFDocument doc = new XWPFDocument();

要添加POI项目有一个P2-库和p2-maven插件具有以下构件:

<artifact> <id>org.apache.poi:poi:3.14</id> <source>true</source> <transitive>false</transitive>
<instructions> <Import-Package></Import-Package> <Export-Package>*</Export-Package> <DynamicImport-Package>*</DynamicImport-Package> </instructions> </artifact>

(并用<id>org.apache.poi:poi-ooxml:3.14</id><id>org.apache.poi:poi-ooxml-schemas:3.14</id>相同) 。

我试着直接在代码POILogger logger = POILogFactory.getLogger(POIXMLDocumentPart.class); logger.log(POILogger.INFO, "Test");中使用POILoggerFactory,它工作正常! 我不知道,怎么了。

回答

0

请注意。检查poi.jar和poi-ooxml.jar的版本,如果它们相同或者任何旧的POI jar已经在你的类路径中。 你可以试试这段代码来获得你的编译器读取的POI的jar的版本:

ClassLoader classloader = 
    org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader(); 
URL resPath = classloader.getResource(
     "org/apache/poi/poifs/filesystem/POIFSFileSystem.class"); 
String path = resPath.getPath(); 
System.out.println("The actual POI Path is " + path); 

这里是POI组件列表 - http://poi.apache.org/overview.html#components

据我所知,这些都为依存列表POI

POI-3.10-Final.jar POI-OOXML-3.10-Final.jar POI-OOXML-架构 - 3.10.jar 的XMLBeans,2.30.jar

我希望它有帮助。

+0

此代码返回“实际的POI路径是/org/apache/poi/poifs/filesystem/POIFSFileSystem.class”。我在classpath中看不到任何poi-jar,它们位于Plug-in Dependencies中。也没有旧的POI罐子。我已经看到了这个依赖关系列表,它们也都在我的插件依赖关系中。我打算使用3.14 poi版本 – Andrew

+0

jar文件是否在root下? –

+0

对不起,我不明白你的意思。Jar在Eclipse的插件中 – Andrew

0

我也遇到过这个问题。这似乎是两个软件包中同名软件包的一个问题(我发现this article)。一旦我解决了这个问题,就有更多的类错误需要解决。

因此,试图在Import-PackageRequire-Bundle几个变化后,以下是其工作为我的项目的P2-Maven插件配置:

<artifacts> 
    <artifact> 
     <id>org.apache.poi:poi:3.16</id> 
     <source>true</source> 
     <instructions> 
     <Import-Package>*;resolution:=optional</Import-Package> 
     <Export-Package>*;-noimport:=true</Export-Package> 
     </instructions> 
    </artifact> 

    <artifact> 
     <id>org.apache.poi:poi-ooxml:3.16</id> 
     <source>true</source> 
     <instructions> 
     <Import-Package>*;resolution:=optional</Import-Package> 
     <Export-Package>*;-noimport:=true</Export-Package> 
     <Require-Bundle>org.apache.poi;bundle-version="[3.16.0,4.0.0)"</Require-Bundle> 
     </instructions> 
    </artifact> 

    <artifact> 
     <id>org.apache.poi:poi-ooxml-schemas:3.16</id> 
     <source>true</source> 
     <instructions> 
     <Import-Package>!org.apache.poi,org.apache.xmlbeans.impl.schema;resolution:=optional,*;resolution:=optional</Import-Package> 
     <Export-Package>*;-noimport:=true</Export-Package> 
     <Require-Bundle>org.apache.poi.ooxml;bundle-version="[3.16.0,4.0.0)"</Require-Bundle> 
     </instructions> 
    </artifact> 
    </artifacts> 

的重要组成部分是:

  • ooxml需要poi包(导入org.apache.poi.util确实不是工作)
  • ooxml-schema确实进口包org.apach.poi,不导入org.apache.xmlbeans.impl.schema包,并要求poi-ooxml