这是在使用IKVM的.net应用程序中使用saxon9ee.jar的情况(我们单独编译因为我们使用不同的IKVM)。
我运行set以在调试器中删除任何异常,因为我遵循快乐路径中没有异常的做法。
Saxon为以下类抛出ClassNotFoundException,但运行正常:
这是一个问题还是预期的?
更新:好的,这绝对是类加载器(IKVM)的问题。答案是IKVM Class Loader。
com.saxonica.ee.domino.DominoNode
- 我发现这个例外有点令人惊讶。如果你的构建包含com.saxonica.ee.domino
包,那么我希望这个类的动态加载成功;如果没有那么我会期望不尝试动态加载。通过调用Configuration.registerExternalObjectModel()
启动动态负载。
com.saxonica.xsltextn.style.SaxonElementFactory
,com.saxonica.ee.extfn.js.IXSLElementFactory
- 类似于这两个,据我所知,只有在类实际存在的情况下才会尝试动态加载。
所以我认为我们在这里看到的是一个类存在的情况,但是类的动态加载失败了。这表明类加载环境存在某种问题,作为第一步,可能值得研究为什么会出现类加载失败。
Saxon很可能在没有这些“插件”类的情况下运行,因此它们没有被加载的事实可能对你的应用程序没有问题,但它确实向我提出了类加载环境可能存在的问题。还有其他更严重的症状。
问题是类加载器找不到类 - 即使调用和所需的类在同一个DLL中(请记住这是IKVM所以DLL,而不是JAR)。
这个原因,以及解决方案,are described in this blog entry。
当我们的代码首次初始化时,我们通过添加以下调用来解决它。此代码与所有Saxon代码位于同一个DLL中(我们创建了所有代码和所有第三方JAR的单个DLL)。
// use misspelled addBootClassPathAssemby
ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.GetExecutingAssembly ());