我们正在做的有些奇怪。我们通过在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中?
谢谢-戴夫
答案 0 :(得分:0)
我怀疑com.sun.org.apache.xerces
在Oracle JDK中存在,但在OpenJDK中不存在,并且IKVM库基于OpenJDK。您可能应该使用JAXP机制(SAXParserFactory
或XMLReaderFactory
)来获取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(包括直接实例化它,而忽略工厂方法)。