提问者:小点点

Saxon在Windows应用程序中找不到类,在命令行中很好


我们做的有点奇怪。我们在.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中?

谢谢-戴夫


共1个答案

匿名用户

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

后来

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

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

(b)查看元信息/服务

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

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