NoClassDefFoundError:org / apache / poi / util / POILogFactory

时间:2016-08-16 08:26:54

标签: eclipse maven apache-poi eclipse-rcp p2

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

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

要将poi添加到项目中,有一个p2-repository和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,它可以正常工作! 我不知道,有什么不对。

2 个答案:

答案 0 :(得分:0)

PLS。检查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

我希望它有所帮助。

答案 1 :(得分: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