4

i は、エコー サービス用にこのようなスカラ コードを使用します。

import scala.actors.Actor import scala.actors.Actor._ import scala.actors.remote.RemoteActor._

class Echo extends Actor {
   デフ行為(){
        アライブ(9010)
        register('私の名前、自分)

     ループ {
       反応する{
            ケース msg => println(msg)
       }
     }
   }
}
オブジェクトEchoServer {

   def main(args: Array[String]): unit = {
        val エコー = 新しいエコー
        echo.start
        println("エコーサーバー開始")
   }
}
EchoServer.main(ヌル)

しかし、いくつかの例外があります。

java.lang.NoClassDefFoundError: Main$$anon$1$Echo$$anonfun$act$1
 at Main$$anon$1$Echo.act((仮想ファイル):16)
 scala.actors.Reaction.run(Reaction.scala:76) で
 scala.actors.Actor$$anonfun$start$1.apply(Actor.scala:785) で
 at scala.actors.Actor$$anonfun$start$1.apply(Actor.scala:783)
 at scala.actors.FJTaskScheduler2$$anon$1.run(FJTaskScheduler2.scala:160)
 at scala.actors.FJTask$Wrap.run(不明なソース)
 scala.actors.FJTaskRunner.scanWhileIdling で (不明なソース)
 at scala.actors.FJTaskRunner.run(不明なソース)
原因: java.lang.ClassNotFoundException: Main$$anon$1$Echo$$anonfun$act$1
 java.net.URLClassLoader$1.run(URLClassLoader.java:200) で
 java.security.AccessController.doPrivileged(ネイティブメソッド)で
 java.net.URLClassLoader.findClass(URLClassLoader.java:188) で
 java.lang.ClassLoader.loadClass(ClassLoader.java:307) で
 java.lang.ClassLoader.loadClass(ClassLoader.java:252) で
 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)で
 ... 8 つ以上

どうやってそれを引き起こすのかわかりません。ちなみに、私のscalaバージョンは2.7.5です

4

2 に答える 2

3

ClassNotFoundException何かがコンパイルされていない可能性があり、コンパイルされているはずであることを示します。どのようにコンパイルしましたか?手動でscalac

次のことを試してくださいrm *.class scalac *.scala scala EchoServer

以下の作品:


EchoServer.scala

import scala.actors.Actor
import scala.actors.Actor._
import scala.actors.remote.RemoteActor._

class Echo extends Actor {
   def act() {
        alive(9010)
        register('myName, self)

     loop {
       react {
            case msg  =>  println(msg)
       }
     }
   }
}

object EchoServer  {

   def main(args: Array[String]): unit = {
        val echo = new Echo
        echo.start
        println("Echo server started")
   }
} 

Client.scala

import scala.actors.Actor._
import scala.actors.remote.Node
import scala.actors.remote.RemoteActor._

object Client extends Application {
    override def main(args: Array[String]) {
        if (args.length < 1) {
            println("Usage: scala Client [msg]")
            return
        }

        actor {
            val remoteActor = select(Node("localhost", 9010), 'myName)

            remoteActor !? args(0) match {
                case msg => println( "Server's response is [" + msg + "]" )
            }
        }
    }
}

コマンドライン:

rm *.class && scalac *.scala  && scala EchoServer

そして他の端末で:

scala Client hello
于 2010-05-03T11:40:03.390 に答える
0

リモート アクターにクラスローダーを設定する必要があります。

メソッドの前に、act()次の行を追加します。

RemoteActor.classLoader = getClass.getClassLoader

Scala RemoteActors でクラスローダーの設定が必要なのはなぜですか?

于 2010-08-22T16:53:09.990 に答える