我正在为 Oracle WCC 编写自定义组件,以便从Excel文件中读取和处理元数据更新。
但是,当我的组件尝试使用apache-poi(版本: 3.11)读取文件时,我收到以下异常:
discardedCount
我已将库文件添加到hda文件中的组件类路径中。
!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)
注意:缺少的类应由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
提供,这是一个maven依赖项,并包含在组件Classpath中,并复制到lib文件夹中。
那我为什么得到例外?
为什么服务器无法找到xml-apis-1.0.b2.jar
?
进一步的问题
我希望我不会把它发送到错误的兔子洞,但是当使用oracle-ucm时,前同事在使用apache-fop org.xml.sax.EntityResolver
时遇到了问题。由于 fop 使用了自己的自定义类加载器。 apache-poi是否有同样的问题?
Manifest.hda (组件列表)
IdcClassLoader
答案 0 :(得分:1)
尝试查找系统正在使用的Jar文件。可能存在依赖冲突。您可以在com.lowes.content.edam.massMetaDataUpdate.file.impl.ExcelFileParser
课程中使用以下检查:
System.out.println(EntityResolver.class.getProtectionDomain().getCodeSource().getLocation());
这将找到该类的所有者Jar文件。您的SAX很可能是从较旧(或较新的?)库中加载的,其中EntityResolver仍然(或已经)缺席。
答案 1 :(得分:0)
我在http://search.maven.org中搜索了 org.xml.sax.EntityResolver 类 并且可以看到缺少的类在sax-2.0.1.jar
中请下载jar并将其添加到类路径中。 http://search.maven.org/#search|ga|1|fc%3A%22org.xml.sax.EntityResolver%22
答案 2 :(得分:0)
Here是组件.hda文件的示例。
答案 3 :(得分:0)
检查您的manifest.hda并确保将&#39;组件名称&#39; / libs添加为componentExtra或componentLib,否则这些库库将不会被部署到内容服务器&#39 ;组件安装时的文件系统(因此在运行时不会解析这些类)。如果您查看有问题的user_project的WCC实例的文件系统,则可以检查此假设。
类加载器可能包含已加载的一个SAX实现的类。尝试从类路径中完全删除xml-apis-1.0.b2.jar。我敢打算在兼容的类路径中实现竞争的SAX实现。
答案 4 :(得分:0)
尝试禁用 ReportPublisher 组件。它似乎有相同的库。