NoClassDefFoundError: org/apache/poi/util/POILogFactory

问题描述 投票:0回答:3

我正在尝试在 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>
相同) .

我尝试在代码中直接使用 POILoggerFactory

POILogger logger =   POILogFactory.getLogger(POIXMLDocumentPart.class); logger.log(POILogger.INFO, "Test");
并且它有效! 我不知道,怎么了。

eclipse maven apache-poi eclipse-rcp p2
3个回答
4
投票

请。检查 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-schemas-3.10.jar xmlbeans-2.30.jar

希望对您有所帮助。


0
投票

我也遇到了这个问题。这似乎是跨两个捆绑包的同名包的问题(我找到了this article)。一旦我解决了这个问题,就会有更多的类错误需要解决。

所以,在尝试了

Import-Package
Require-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

0
投票

我和你一样的情况。 我从以下位置下载库 apache poi:https://drive.google.com/file/d/1KIGnqyo2nLuBXXOoxkJKhyptDY31X8ak/view 解决问题。 希望对你有帮助!!!

© www.soinside.com 2019 - 2024. All rights reserved.