Xml SaxOne:9.8 ClassNotFoundException:AtomicTypeValidator执行saxonValidator.validate时

Xml SaxOne:9.8 ClassNotFoundException:AtomicTypeValidator执行saxonValidator.validate时,xml,xsd,saxon,xml-validation,Xml,Xsd,Saxon,Xml Validation,我使用Saxon EE API用XSD验证XML负载。我的环境是OSGi 对于特定的XSD,我面临一个奇怪的错误 java.lang.NoClassDefFoundError: com/saxonica/ee/bytecode/simtype/AtomicTypeValidator at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.

我使用Saxon EE API用XSD验证XML负载。我的环境是OSGi

对于特定的XSD,我面临一个奇怪的错误

java.lang.NoClassDefFoundError: com/saxonica/ee/bytecode/simtype/AtomicTypeValidator
   at java.lang.ClassLoader.defineClass1(Native Method)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:858)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:704)
   at net.sf.saxon.java.JavaPlatform$MyClassLoader.registerClass(JavaPlatform.java:441)
   at com.saxonica.ee.bytecode.util.CompilerService.makeClass(CompilerService.java:1067)
   at com.saxonica.ee.bytecode.util.CompilerService.compileAtomicValidator(CompilerService.java:1241)
   at com.saxonica.ee.schema.UserAtomicType.validateContent(UserAtomicType.java:373)
   at com.saxonica.ee.validate.SimpleContentValidator.endElement(SimpleContentValidator.java:239)
   at com.saxonica.ee.validate.ValidationStack.endElement(ValidationStack.java:412)
   at net.sf.saxon.event.ProxyReceiver.endElement(ProxyReceiver.java:182)
   at net.sf.saxon.event.StartTagBuffer.endElement(StartTagBuffer.java:290)
   at com.saxonica.ee.validate.StartTagBufferEE.endElement(StartTagBufferEE.java:58)
   at net.sf.saxon.event.PathMaintainer.endElement(PathMaintainer.java:62)
   at net.sf.saxon.event.DocumentValidator.endElement(DocumentValidator.java:68)
   at net.sf.saxon.event.ReceivingContentHandler.endElement(ReceivingContentHandler.java:459)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2967)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
   at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
   at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
   at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
   at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:427)
   at net.sf.saxon.event.Sender.send(Sender.java:164)
   at com.saxonica.ee.s9api.SchemaValidatorImpl.validate(SchemaValidatorImpl.java:587)
观察:如果我们限制有效负载的大小,即限制xml元素的数量,那么具有相同XSD和有效负载的场景可以正常工作;如果我们减少到少于80个元素,它就会工作,超过80个元素我们就会得到以下错误


有什么帮助吗

在使用OSGi的环境中,我们遇到了两个类似的问题,涉及到Saxon字节码的生成,请参见

在这些情况下,用户可以通过在Saxon配置上设置不同的类加载器来绕过这个问题

我有点不愿意在这方面更改产品代码,因为它很难测试。使用自定义类加载的环境(如Websphere和Eclipse)往往是我们在“实验室”中没有安装的东西,这使得很难确保我们所做的任何更改不会导致其他工作负载失败

只有当文件达到一定大小时才会出现问题的原因是字节码生成只针对执行了一定次数的代码片段,以确保在没有好处的情况下不会产生生成代码的成本。(在本例中,通过模式验证,字节码对特定用户定义的XSD简单类型执行验证)


当然,您可以通过适当的配置设置完全禁用字节码生成。

非常感谢您的快速回复。使用共享链接中建议的类加载器会有所帮助。