2010-08-22 10 views
5

Bei der Verwendung von Scala RemoteActors erhielt ich eine ClassNotFoundException, die sich auf scala.actors.remote.NetKernel bezog. Ich kopierte das Beispiel eines anderen und fügte meinem Akteur RemoteActor.classLoader = getClass.getClassLoader hinzu und jetzt funktioniert alles. Warum ist das notwendig?Warum wird der Classloader mit Scala RemoteActors benötigt?

Antwort

5

Remote-Actors verwenden die Java-Serialisierung, um Nachrichten hin- und herzusenden. In der Actor-Bibliothek finden Sie einen benutzerdefinierten Objekt-Eingabestream (https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/actors/scala/actors/remote/JavaSerializer.scala), mit dem Objekte zu/von einem Socket serialisiert werden. Es gibt auch Routing-Code und andere Magie.

In jedem Fall ist der ClassLoader für Remoting ziemlich wichtig. Ich würde empfehlen, Java RMI nachzuschlagen, wenn Sie damit nicht vertraut sind. In jedem Fall ist der ClassLoader, den Scala beim Serialisieren/Deserialisieren von Akteuren auswählt, derjenige, der sich auf RemoteActor befindet und standardmäßig auf null gesetzt ist.

Dies bedeutet, dass Sie unglücklich sein werden, ohne einen ClassLoader zu spezifizieren;).

Wenn Sie sich in einer Umgebung befinden, die Klassenladeprogramme wie OSGi steuert, sollten Sie sicherstellen, dass Sie diesen Wert einem Klassenlader zuweisen, der Zugriff auf alle von serialisierten Aktoren verwendeten Klassen hat.

Hoffe, dass hilft!

+0

Vielen Dank für die gründliche Antwort. Gibt es keine Möglichkeit, dass Scala einen besseren Standard als null wählen könnte? –

+0

'null' ist der Plattformstandard, soweit ich weiß. Tatsächlich bezieht sich der Klassenlader "null" auf den "System class loader", der die Java-Laufzeitumgebung einrichtet. – soc

+0

Warum ist der System-Classloader nicht in Ordnung? –

Verwandte Themen