撒克逊人无法在Windows应用中找到课程,可以在命令行中正常运行

时间:2018-07-15 16:54:04

标签: saxon xerces ikvm

我们正在做的有些奇怪。我们通过在IKVM中将Java Saxon与所有其他Java代码一起进行编译,来使用.NET中的Java Saxon。在命令行应用中,效果很好。

但是在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版本的DLL中?

谢谢-戴夫

1 个答案:

答案 0 :(得分:0)

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

LATER

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

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

(b)查看META-INF /服务

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

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