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

时间:2012-11-08 07:38:54

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

在Jboss 5.0 EAP中获得以下异常,但它在JBoss 5.1 GA中运行良好。

我们使用的是POI 3.7,其中包含的是

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

4 个答案:

答案 0 :(得分:8)

看起来你的应用程序正在抛出你看到的异常,因为在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的{​​{1}}类import

我发现org.apache.xmlbeans.XmlOptions内的XMLOptions课程包含在xbean.jar lib文件夹中xmlbeans-2.6.0.zip可从其中一个镜像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 - 或许值得一看?

答案 1 :(得分: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发行版中。

答案 2 :(得分:1)

仅通过添加xbean.jar,就无法解决问题。它会继续抱怨没找到的课程。我所做的不仅是导入xbean.jar,还导入了xmlbeans-2.5.0的lib文件夹下列出的其他jar文件

答案 3 :(得分:1)

将以下jar放在classpath中就可以了:

  • dom4j-1.6.1.jar

  • POI-3.9-20121203.jar

  • POI-OOXML-3.9-20121203.jar

  • POI-OOXML-架构 - 3.9-20121203.jar

  • 的xmlbeans-2.3.0.jar