【问题标题】:Why are the following classes are not found为什么找不到以下类
【发布时间】:2019-01-24 16:31:27
【问题描述】:

这是在使用 IKVM 的 .net 应用程序中使用 saxon9ee.jar 的情况(我们单独编译,因为我们使用不同的 IKVM)。

当我遵循快乐路径中没有异常的做法时,我运行设置以将我放入调试器中。

Saxon 正在为以下类抛出 ClassNotFoundException,但它运行良好:

  • com.saxonica.ee.domino.DominoNode
  • com.saxonica.xsltextn.style.SaxonElementFactory
  • com.saxonica.ee.extfn.js.IXSLElementFactory

这是一个问题还是预期?

更新:好的,肯定是类加载器(IKVM)的问题。答案是IKVM Class Loader

【问题讨论】:

  • IKVM 背后的主要开发者于去年 4 月宣布结束该项目,weblog.ikvm.net 所以如果这是您想要使用的方法,您可能应该三思而后行。
  • @LexLi - 我们已经开始支持它(一项优化)。让它消失太有用了。
  • 太好了!但是如果你已经开始了,你应该发出更多的声音来通知社区:) GitHub 组织/repo 等将是一个更好的信号来恢复它并重新获得关注。
  • @LexLi - 已经完成 - github.com/wwrd/ikvm & stackoverflow.com/questions/50615183/… 大约一个月前,我还通过电子邮件发送了 ikvm 开发人员电子邮件列表。
  • 既然你有一个repo,我会在那里而不是在这里写我的意见。

标签: .net saxon ikvm


【解决方案1】:

问题是类加载器找不到类 - 即使调用和所需的类在同一个 DLL 中(记住这是 IKVM 所以 DLL,而不是 JAR)。

造成这种情况的原因和解决方法,are described in this blog entry

我们通过在代码首次初始化时添加以下调用解决了这个问题。此代码与所有 Saxon 代码位于同一个 DLL 中(我们为所有代码和所有 3rd 方 JAR 创建一个 DLL)。

// use misspelled addBootClassPathAssemby 
ikvm.runtime.Startup.addBootClassPathAssemby(System.Reflection.Assembly.GetExecutingAssembly ());

【讨论】:

    【解决方案2】:

    com.saxonica.ee.domino.DominoNode -- 我发现这里的异常有点令人惊讶。如果您的构建包含com.saxonica.ee.domino 包,那么我希望此类的动态加载能够成功;如果没有,那么我希望不会尝试动态加载。动态加载由对Configuration.registerExternalObjectModel() 的调用启动。

    com.saxonica.xsltextn.style.SaxonElementFactory, com.saxonica.ee.extfn.js.IXSLElementFactory -- 这两个类似,据我所知,只有在类实际存在的情况下才会尝试动态加载。

    所以我认为我们在这里看到的是类存在,但类的动态加载失败的情况。这表明类加载环境存在某种问题,作为第一步,可能值得调查类加载失败的原因。

    Saxon 很可能在没有这些“插件”类的情况下运行,因此它们没有被加载的事实对您的应用程序来说可能没有问题,但它确实暗示了类加载的潜在问题可能还有其他更严重症状的环境。

    【讨论】:

    • 这绝对是类加载器 - 当我尝试时也无法加载我们的类。关于如何在 IKVM 中执行此操作的任何绝妙想法?谢谢
    • 您能否更具体地写出您所做的事情,以便我们可以使用这些信息来帮助其他用户?
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多