SaxonEE: 9.8 ClassNotFoundException: AtomicTypeValidator при выполнении saxonValidator.validate - PullRequest
0 голосов
/ 16 января 2019

Я использую Saxon EE API для проверки полезной нагрузки XML с помощью XSD. Моя среда 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)

Замечание: сценарий с тем же XSD и полезной нагрузкой работает нормально, если мы ограничиваем размер полезной нагрузки, то есть этим количеством элементов xml; если мы уменьшим до менее чем 80 элементов, это сработает, и более 80 элементов получат следующую ошибку.

Любая помощь?

1 Ответ

0 голосов
/ 16 января 2019

У нас было несколько похожих проблем, связанных с генерацией байт-кода Saxon в средах, использующих OSGi, см.

https://saxonica.plan.io/issues/4036

https://saxonica.plan.io/issues/3814

Пользователи в этих случаях смогли обойти проблему, установив другой загрузчик классов в конфигурации Saxon.

Я немного неохотно менял код продукта в этой области, потому что его очень сложно протестировать. Среды, которые используют пользовательскую загрузку классов (например, Websphere и Eclipse), как правило, представляют собой вещи, которые мы не установили «в лаборатории», что затрудняет уверенность в том, что любые изменения, которые мы вносим, ​​не вызывают других рабочих нагрузок. потерпеть неудачу.

Причина, по которой проблема возникает, только когда файл достигает определенного размера, заключается в том, что генерация байт-кода происходит только для фрагментов кода, которые выполнялись определенное количество раз, чтобы гарантировать, что затраты на генерацию кода не будут это не приносит никакой пользы. (В этом случае при проверке схемы байт-код выполняет проверку в отношении определенных пользовательских простых типов XSD).

Конечно, вы можете полностью отключить генерацию байт-кода с помощью соответствующей настройки в Конфигурации.

...