Java.lang.NoClassDefFoundError: 无法初始化类org.apache.poi.POIXMLDocument在Jboss 5.0 EAP上。

6

在 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中解决此问题。

1
是我还是这个堆栈跟踪看起来像是堆栈跟踪的截图OCR扫描? - Luke Woodward
@LukeWoodward 是的,这是一次OCR扫描。 - nidhin
4个回答

12

看起来您的应用程序之所以抛出您看到的异常,是因为在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中,因此它们不是问题所在。因此,通过排除法,似乎缺少从org.apache.xmlbeans.XmlOptions 导入的XmlOptions类。

我在可从其中一个镜像站下载的xmlbeans-2.6.0.zip的lib文件夹中找到了这个XMLOptions类,这个zip文件中包含了 xbean.jar

我认为,添加此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-也许值得研究一下?


链接失效了。哦,它是在2012年发布的。 - Charith Jayasanka
@CharithJayasanka:如果你在2023年仍在使用JBoss 5.0,当然可以从https://xmlbeans.apache.org/download/index.html下载XMLBeans JAR文件,只需快速搜索一下即可找到。不过我不建议使用XMLBeans版本2.6.0,因为它存在安全漏洞。 - Luke Woodward
我正在使用Tomcat 9。 - Charith Jayasanka

5

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

错误:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.poi.POIXMLTypeLoader

我将最新版本的xmlbeans-2.6.0 jar(之前是2.4.0)包含在我的部署中,这个jar文件在Apache POI 3.14分发版的ooxml-lib文件夹中。


1
我在使用poi-4.0.1时遇到了同样的错误。通过升级xmlbeans到3.0.2版本,问题得以解决。 - RJ.Hwang

3
将以下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时,这对我也起作用。谢谢。 - DKMDebugin

1

仅添加xbean.jar是无法解决问题的。它会持续抱怨找不到类。我的做法是导入不仅是xbean.jar,还有其他列在xmlbeans-2.5.0的lib文件夹下的jar文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接