【问题标题】:java.lang.NoClassDefFoundError: Could not initialize class org.apache.poi.POIXMLDocument on Jboss 5.0 EAPjava.lang.NoClassDefFoundError: 无法在 Jboss 5.0 EAP 上初始化类 org.apache.poi.POIXMLDocument
【发布时间】:2012-10-28 09:14:49
【问题描述】:

在 JBoss 5.0 EAP 中出现以下异常,但在 JBoss 5.1 GA 中可以正常工作。

我们使用的是 POI 3.7,包含的 jars 是

  • poi-3.7.jar
  • poi-ooxml-schemas.jar
  • poi-ooxml.jar

堆栈跟踪是

ERROR [org.apache.catalina.core.ContainerBase.[jboss.ueb].[localhost].[fesbcon-Fig].[Faces Servlet]]
    3;13;44.4g3pM (http-0.0.0.0-8280-1) Servlet.service() -For servlet Faces Servlet threu exception
    java.lang.NoClassDe-FFoundError: Could not initialize class org.apache.poi.POIXMLDocument
    at org.apache.poi.ss.usermodel.HorkbookFactory.create(HorkbookFactory.java:62)
    at com.-Ferguson.esb.con-Fig.controller.AssociationsExcelUploadController.submit(Unknoun Source)
    at sun.re-Flect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.re-Flect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.re-Flect.DelegatingMethodAccessorImpl.invoke(Delegating?ethodAccessorImpl.java:25)
    at java.lang.re-Flect.Method.invoke(Method.java:597)
    at org.apache.my-Faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132)
    at org.apache.my-Faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)

请告知如何在 JBoss 5.0 EAP 中解决此问题

【问题讨论】:

  • 是我还是那个堆栈跟踪看起来像是堆栈跟踪屏幕截图的 OCR 扫描?
  • @LukeWoodward 是的,它是 OCR 扫描

标签: java apache-poi jboss5.x jsf-1.2


【解决方案1】:

看起来您的应用程序正在抛出您所看到的异常,因为在 JBoss 5.0 下运行时不存在 Apache XMLBeans JAR 或类。 Apache POI 似乎正在尝试加载 org.apache.xmlbeans.XMLOptions 类,但找不到此类。

消息Could not initialize class SomeClass表示JVM已经两次尝试加载和静态初始化类SomeClass失败。在这种情况下,有问题的类是org.apache.poi.POIXMLDocument

类的静态初始化包括静态初始化其超类、为所有static 字段分配值和运行所有static 初始化程序块。 POIXMLDocument 类有几个 static String 常量,不会造成任何问题,但没有静态初始化程序。然而,它是POIXMLDocumentPart 的子类,它是Object 的子类,具有以下静态初始化代码:

    private static POILogger logger = POILogFactory.getLogger(POIXMLDocumentPart.class);

    public static final XmlOptions DEFAULT_XML_OPTIONS;
    static {
        DEFAULT_XML_OPTIONS = new XmlOptions();
        DEFAULT_XML_OPTIONS.setSaveOuter();
        DEFAULT_XML_OPTIONS.setUseDefaultNamespace();
        DEFAULT_XML_OPTIONS.setSaveAggressiveNamespaces();
    }

如果 JVM 无法加载所有 POILoggerPOILogFactoryXmlOptions 类,此静态初始化将失败。

POILoggerPOILogFactory 类都是从包 org.apache.poi.util.POILogFactory 导入的,并且这两个类都包含在 poi-3.7.jar 中,所以它们不是问题所在。所以,通过排除,似乎XmlOptions 类,imported 来自org.apache.xmlbeans.XmlOptions,一定是丢失了。

我在 xbean.jar 中发现了这个 XMLOptions 类,该类包含在 xmlbeans-2.6.0.ziplib 文件夹中,可从其中一个镜像 here 下载。

在我看来,添加这个 JAR 可能会解决 JBoss 5.0 EAP 上的问题。但是,我知道您说您的应用程序在 JBoss 5.1 GA 中运行良好,这对我来说意味着 JBoss 5.1 GA 包含此 JAR 的副本,而 5.0 EAP 没有。因此,我不确定解决此问题的最佳方法是什么。我会犹豫是否将此 XMLBeans JAR 添加到您的应用程序中,因为这样做可能会在您在 JBoss 5.1 下运行它时导致问题。不过,我不知道是否有办法向 JBoss 5.0 添加额外的“库”JAR - 也许这值得一看?

【讨论】:

    【解决方案2】:

    只添加 xbean.jar 并不能解决问题。它将继续抱怨找不到类。我所做的是不仅导入 xbean.jar 还导入 xmlbeans-2.5.0 的 lib 文件夹下列出的其他 jar 文件

    【讨论】:

      【解决方案3】:

      我在使用 Apache POI 3.14 的 JBoss 8.2 (WildFly 8.2.0.Final) 上运行时遇到了同样的错误

      错误:

      原因:java.lang.NoClassDefFoundError: 无法初始化类 org.apache.poi.POIXMLTypeLoader

      我通过将最新的 xmlbeans-2.6.0 jar(我以前有 2.4.0)包含在我的部署中来解决此问题,该部署包含在 ooxml-lib 文件夹中的 Apache POI 3.14 发行版中。

      【讨论】:

      • 我对 poi-4.0.1 有同样的错误。并通过将 xmlbeans 升级到 3.0.2 来修复。
      【解决方案4】:

      将以下 jar 放在类路径中即可:

      • dom4j-1.6.1.jar

      • poi-3.9-20121203.jar

      • poi-ooxml-3.9-20121203.jar

      • poi-ooxml-schemas-3.9-20121203.jar

      • xmlbeans-2.3.0.jar

      【讨论】:

      • 当 org.apache.poi.xwpf.usermodel.XWPFDocument 丢失时,这也适用于我。谢谢。
      猜你喜欢
      • 2023-03-24
      • 2012-10-10
      • 2013-08-08
      • 2020-09-27
      • 2012-08-26
      • 2015-10-29
      • 2017-09-12
      • 2016-07-07
      相关资源
      最近更新 更多