我正在试验akka,我已经编写了两个具有主要功能的伪参与者:
HelloActor
package akkaSample.severalSystems
import akka.actor.{Actor, ActorSystem}
class HelloActor extends Actor {
def receive = {
case "mew" => println("I said mew")
case "hello" => println("hello back at you")
case "shutdown" => context.stop(self)
case _ => println("huh?")
}
}
object Main extends App {
val system = ActorSystem("HelloSystem")
println("started")
}
其他因素
package akkaSample.severalSystems
import akka.actor.{Actor, ActorSystem}
class OtherActor extends Actor {
def receive = {
case "mew" => println("I said mew")
case _ => println("huh?")
}
}
object Main extends App {
val system = ActorSystem("HelloSystem")
println("started")
}
我正在尝试运行intellij idea的主函数(同时来自OtherActor和HelloActor),并得到编译错误:
Error:(12, 8) Main is already defined as object Main
object Main extends App {
^
我为什么得到它?主要功能放在不同的文件中!如何在scala/akka中编写2个主要函数,并从相邻的参与者那里运行它们?
此外,对于不扩展actor主函数工作的空scala类,以下是代码:
一级
package akkaSample.mainError
class One {
}
object Main extends App {
println("Hi!")
}
第二类
package akkaSample.mainError
class Two {
}
object Main extends App {
println("Hi!")
}
没有编译错误。
p.S.这只是为了试验,我不打算在生产中使用带有两个主要功能的代码。
您已经定义了两次具有相同名称的对象。编译器无法区分这两者。
扩展App
的对象不需要称为Main
。您可以调用一个HelloActorMain
和另一个OtherActorMain
。在这种情况下,sbt将允许您选择要运行的主类。
编译器错误说明了一切:您正试图定义一个名为akkaSample.severalSystems.Main的对象,但已经存在一个同名对象。这是不可能的,因为编译器需要为两者生成一个具有相同名称的JVM类(akkaSample.serverSystems.Main$),因此它们不能同时加载;此外,它们必须写在具有相同名称(Main$.class)的文件中,并位于相同的目录中。
我更好奇的是,为什么你的第二个例子没有产生错误——但这肯定与你的两个对象不仅名称相同,而且完全相同有关。