Oracle WCC NoClassDefFoundError: org/xml/sax/EntityResolver when running Apache POI in Custom Component

Oracle WCC NoClassDefFoundError: org/xml/sax/EntityResolver when running Apache POI in Custom Component

我正在为 Oracle WCC 编写自定义组件,以从 Excel 文件中读入和处理元数据更新。

但是,当我的组件尝试使用 版本: 3.11)读取文件时,出现以下异常:

!csUserEventMessage,weblogic,localhost:16200!$!csUnableToExecMethod,runTheMassUpdate!syJavaExceptionWrapper,java.lang.NoClassDefFoundError: org/xml/sax/EntityResolver
intradoc.common.ServiceException: !csUnableToExecMethod,runTheMassUpdate
*ScriptStack LOWES_MMU_SERVICE
3:runTheMassUpdate,**no captured values**
        at intradoc.server.ServiceRequestImplementor.buildServiceException(ServiceRequestImplementor.java:2176)
        at intradoc.server.Service.buildServiceException(Service.java:2404)
        at intradoc.server.Service.createServiceExceptionEx(Service.java:2398)
        at intradoc.server.Service.createServiceException(Service.java:2393)
        at intradoc.server.Service.doCodeEx(Service.java:673)
        at intradoc.server.Service.doCode(Service.java:594)
        at intradoc.server.ServiceRequestImplementor.doAction(ServiceRequestImplementor.java:1693)
        at intradoc.server.Service.doAction(Service.java:566)
   /* Lines removed for brevity */
Caused by: java.lang.NoClassDefFoundError: org/xml/sax/EntityResolver
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at intradoc.loader.IdcClassLoader.defineClass(IdcClassLoader.java:639)
        at intradoc.loader.IdcClassLoader.findClass(IdcClassLoader.java:794)
        at intradoc.loader.IdcClassLoader.loadClass(IdcClassLoader.java:677)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at intradoc.loader.IdcClassLoader.defineClass(IdcClassLoader.java:639)
        at intradoc.loader.IdcClassLoader.findClass(IdcClassLoader.java:794)
        at intradoc.loader.IdcClassLoader.loadClass(IdcClassLoader.java:677)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at org.apache.poi.util.SAXHelper.<clinit>(SAXHelper.java:53)
        at org.apache.poi.util.DocumentHelper.newDocumentBuilder(DocumentHelper.java:45)
        at org.apache.poi.util.DocumentHelper.<clinit>(DocumentHelper.java:100)
        at org.apache.poi.openxml4j.opc.internal.ContentTypeManager.parseContentTypesFile(ContentTypeManager.java:376)
        at org.apache.poi.openxml4j.opc.internal.ContentTypeManager.<init>(ContentTypeManager.java:102)
        at org.apache.poi.openxml4j.opc.internal.ZipContentTypeManager.<init>(ZipContentTypeManager.java:54)
        at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:192)
        at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:673)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:226)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:186)
        at com.lowes.content.edam.massMetaDataUpdate.file.impl.ExcelFileParser.readInputFile(ExcelFileParser.java:162)

我已将库文件添加到我的组件 classhda 文件中的路径。

classpath=$COMPONENT_DIR/classes/:$COMPONENT_DIR/lib/poi-ooxml-3.11.jar:$COMPONENT_DIR/lib/stax-api-1.0.1.jar:$COMPONENT_DIR/lib/xmlbeans-2.3.0.jar:$COMPONENT_DIR/lib/httpcore-4.4.1.jar:$COMPONENT_DIR/lib/jna-4.1.0.jar:$COMPONENT_DIR/lib/guava-11.0.jar:$COMPONENT_DIR/lib/httpmime-4.4.1.jar:$COMPONENT_DIR/lib/javax.servlet-api-3.1.0.jar:$COMPONENT_DIR/lib/xml-apis-1.0.b2.jar:$COMPONENT_DIR/lib/poi-3.11.jar:$COMPONENT_DIR/lib/dom4j-1.6.1.jar:$COMPONENT_DIR/lib/owasp-java-html-sanitizer-1.1.jar:$COMPONENT_DIR/lib/ooxml-schemas-1.1.jar:$COMPONENT_DIR/lib/poi-ooxml-schemas-3.11.jar:$COMPONENT_DIR/lib/jsr173-1.0.jar:$COMPONENT_DIR/lib/jna-platform-4.1.0.jar:$COMPONENT_DIR/lib/httpclient-4.4.1.jar:$COMPONENT_DIR/lib/jsr305-2.0.1.jar
classpathorder=0
libpath=$COMPONENT_DIR/lib
libpathorder=0

注意:缺失的class应该由xml-apis-1.0.b2.jar提供,是maven依赖,并包含在组件Classpath中,并复制到lib 文件夹。

那么为什么我会得到异常? 为什么服务器找不到 org.xml.sax.EntityResolver?

进一步提问 我希望我没有把它发送到错误的兔子洞,而是一位前同事 运行 在使用 IdcClassLoader 时遇到了问题 。由于 fop 使用它自己的自定义 classloader。 有同样的问题吗?


Manifest.hda(组件列表)

component
LowesMassMetadataUpdater/LowesMassMetadataUpdater.hda
componentExtra
LowesMassMetadataUpdater/readme.md
componentClasses
LowesMassMetadataUpdater/classes/
componentLib
LowesMassMetadataUpdater/lib/

我在 http://search.maven.org 中搜索了 class org.xml.sax.EntityResolver 并且可以看到缺少的 class 在 sax-2.0.1.jar

请下载 jar 并将其添加到您的 class 路径。 http://search.maven.org/#search|ga|1|fc%3A%22org.xml.sax.EntityResolver%22

请同时阅读问题:Why am I getting a NoClassDefFoundError in Java?

尝试找到系统正在使用的Jar文件。可能存在依赖冲突。您可以在 com.lowes.content.edam.massMetaDataUpdate.file.impl.ExcelFileParser class 中使用以下检查:

System.out.println(EntityResolver.class.getProtectionDomain().getCodeSource().getLocation());

这将找到 class 的所有者 Jar 文件。您的 SAX 很可能是从旧的(或更新的?)库加载的,其中 EntityResolver 仍然(或已经)不存在。

  1. 您的 类路径 应该用分号(不是冒号)分隔。
  2. 您是否在您的构建设置中设置了 InstallID 组件?

Here 是组件 .hda 文件的示例。

检查您的 manifest.hda 并确保将 'Component Name'/libs 添加为 componentExtra 或 componentLib,否则这些 libs 库将不会部署到内容服务器的文件系统组件安装(因此 类 不会在运行时解析)。如果您查看有问题的 user_project 的 WCC 实例的文件系统,您可以检查这个假设。

类加载器可能已经加载了来自一个 SAX 实现的 类。尝试从类路径中完全删除 xml-apis-1.0.b2.jar。我敢打赌类路径中已经有一个兼容的竞争 SAX 实现。

尝试禁用 ReportPublisher 组件。它似乎有相同的库。