【问题标题】:Why is setting the classloader necessary with Scala RemoteActors?为什么需要使用 Scala RemoteActors 设置类加载器?
【发布时间】:2011-04-02 07:47:24
【问题描述】:

在使用 Scala RemoteActors 时,我得到了一个 ClassNotFoundException,它引用了 scala.actors.remote.NetKernel。我复制了别人的示例并将 RemoteActor.classLoader = getClass.getClassLoader 添加到我的 Actor 中,现在一切正常。为什么需要这样做?

【问题讨论】:

    标签: serialization scala classloader remote-actors


    【解决方案1】:

    Remote Actors 使用 Java 序列化来来回发送消息。在 actor 库中,您会找到一个自定义对象输入流 (https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/actors/scala/actors/remote/JavaSerializer.scala),它用于将对象序列化到套接字或从套接字序列化。还有一些路由代码和其他魔法。

    无论如何,用于远程处理的 ClassLoader 是相当重要的。如果您不熟悉 Java RMI,我建议您查找它。无论如何,Scala 在序列化/反序列化 actor 时选择的 ClassLoader 是位于 RemoteActor 上的,默认为 null。

    这意味着默认情况下,如果不指定 ClassLoader,您将不开心;)。

    如果您处于控制类加载器的环境中,例如 OSGi,您需要确保将此值设置为可以访问 所有 序列化参与者使用的所有类的类加载器。

    希望有帮助!

    【讨论】:

    • 感谢您的详尽回答。 Scala 有没有办法选择比 null 更好的默认值?
    • null 是平台默认值,据我所知。实际上,null 类加载器是指设置 Java 运行时的“系统类加载器”。
    • 为什么系统类加载器不正常?
    • 不是 100% 正确:它不一定使用“System”类加载器,它可能实际上使用“bootstrap”,具体取决于对“latestUserDefinedLoader”的调用。请参阅:forums.sun.com/thread.jspa?threadID=5163767。您会注意到 Scala Actor 使用了类似的解决方案来解决需要您设置 RemoteActor.classLoader 的问题。附带说明一下,维基百科有一篇关于类加载层次结构的不错的文章:en.wikipedia.org/wiki/Java_Classloader
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多