4

我使用这样的 scala 代码来进行回声服务。

导入 scala.actors.Actor 导入 scala.actors.Actor._ 导入 scala.actors.remote.RemoteActor._

类回声扩展演员{
   默认行为(){
        活着(9010)
        注册('我的名字,自我)

     环形 {
       反应{
            案例味精=> println(味精)
       }
     }
   }
}
对象回声服务器 {

   def main(args: Array[String]): unit = {
        val echo = 新回声
        回声开始
        println("回显服务器启动")
   }
}
EchoServer.main(null)

但也有一些例外。

java.lang.NoClassDefFoundError: Main$$anon$1$Echo$$anonfun$act$1
 在 Main$$anon$1$Echo.act((虚拟文件):16)
 在 scala.actors.Reaction.run(Reaction.scala:76)
 在 scala.actors.Actor$$anonfun$start$1.apply(Actor.scala:785)
 在 scala.actors.Actor$$anonfun$start$1.apply(Actor.scala:783)
 在 scala.actors.FJTaskScheduler2$$anon$1.run(FJTaskScheduler2.scala:160)
 在 scala.actors.FJTask$Wrap.run(未知来源)
 在 scala.actors.FJTaskRunner.scanWhileIdling(未知来源)
 在 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")
   }
} 

客户端.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 回答