【问题标题】:Saxon can't find class in Windows app, does fine in command lineSaxon 在 Windows 应用程序中找不到类,在命令行中运行良好
【发布时间】:2018-07-15 16:54:04
【问题描述】:

我们所做的有点奇怪。我们在 .NET 中使用 Java Saxon,方法是使用 IKVM 以及我们所有的其他 Java 代码对其进行编译。在命令行应用程序中效果很好。

但是在我们的 Windows 窗体应用程序中使用所有这些,我们得到:

org.xml.sax.SAXException occurred
  HResult=-2146233088
  Message (System.Exception)=SAX2 driver class com.sun.org.apache.xerces.internal.parsers.SAXParser not found
  Message=SAX2 driver class com.sun.org.apache.xerces.internal.parsers.SAXParser not found
  Source (System.Exception)=IKVM.OpenJDK.XML.API
  Source=IKVM.OpenJDK.XML.API
  StackTrace (System.Exception)=   at org.xml.sax.helpers.XMLReaderFactory.loadClass(ClassLoader , String )
   at org.xml.sax.helpers.XMLReaderFactory.createXMLReader()
   at net.windward.datasource.xml.SaxonDataSource.ctor(InputStream xmlData, InputStream schemaFile, Boolean preserveWhiteSpace)
  StackTrace:
       at org.xml.sax.helpers.XMLReaderFactory.loadClass(ClassLoader , String )
       at org.xml.sax.helpers.XMLReaderFactory.createXMLReader()
       at net.windward.datasource.xml.SaxonDataSource.ctor(InputStream xmlData, InputStream schemaFile, Boolean preserveWhiteSpace)
  InnerException: 

很明显,问题是 com.sun.org.* 在 IKVM 创建的 DLL 中找不到。对我来说奇怪的是命令行应用程序有效,而不是表单应用程序失败。

问题是,我该怎么做才能将 com.sun.org.* 包含在 IKVM-ed DLL 中?

谢谢 - 戴夫

【问题讨论】:

    标签: saxon xerces ikvm


    【解决方案1】:

    我怀疑com.sun.org.apache.xerces 存在于 Oracle JDK 中但不存在于 OpenJDK 中,并且 IKVM 库基于 OpenJDK。您可能应该使用 JAXP 机制(SAXParserFactoryXMLReaderFactory)来获取XMLReader,而不是尝试加载特定的实现类。

    稍后

    好的,从堆栈跟踪看来,您正在调用 XMLReaderFactory.createXMLReader() 来获取解析器。该方法的 JDK 1.8 版本似乎可以:

    (a) 获取系统属性org.xml.sax.driver的值。

    (b) 查看 META-INF/services

    (c) 使用类com.sun.org.apache.xerces.internal.parsers.SAXParser

    我不知道该方法的 IKVM 版本是否相同:如果该解析器实际上不在运行时中,则保留 com.sun.org 后备会有点奇怪。但是有很多方法可以获得不同的 XMLReader(包括直接实例化它,忽略工厂方法)。

    【讨论】:

    • 据我所知,我们没有做任何事情来指定阅读器/解析器。当我们在 .NET 下运行 IKVMed saxon9ee.jar 时,我们应该设置什么?
    • 如果我们的 Java 代码在 Java 和通过 IKVM 的 .NET 中运行,您建议我们最好做什么?谢谢
    • Michael - 你建议我们如何获得 XMLReader?如果 Java 和 .NET 应该不同,那也没关系。谢谢。
    • 我会尝试直接在代码中实例化 Apache Xerces,或者将 org.xml.sax.driver 系统属性设置为 org.apache.xerces.parsers.SAXParser
    • Michael - 我正在努力解决的问题是它在我们的运行时运行良好。在某些版本中,它在我们基于表单的 Office 加载项中运行良好。它目前在两者中都可以正常工作,但是我们在单元测试中遇到了这个问题。为什么会有这些怪​​事?据我所知,最好的情况是我们的代码中没有 Xerces。此外,您如何在您的 .NET 版本中处理这个问题 - 有什么特别的,还是您只是针对 IKVM 构建它? TIA
    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多