我正在尝试使用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")
}
OtherActor
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构思运行main函数(来自OtherActor和HelloActor)并得到编译错误:
Error:(12, 8) Main is already defined as object Main
object Main extends App {
^
为什么我明白了?主要功能放在不同的文件中!如何在scala / akka中编写2个主要函数并从相邻的actor中运行它们?
另外,对于没有扩展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。仅用于试验我不打算将具有2个主要功能的代码投入生产。
答案 0 :(得分:1)
您已经定义了两次具有相同名称的对象。编译器无法区分这两者。
扩展App
的对象不需要调用Main
。您可以拨打一个HelloActorMain
和其他OtherActorMain
。在这种情况下,sbt将允许您选择要运行的主类。
答案 1 :(得分:1)
编译器错误说明了一切:您正在尝试定义一个名为akkaSample.severalSystems.Main的对象,但是已经存在一个具有相同名称的对象。这是不可能的,因为编译器需要生成一个具有相同名称的JVM类(akkaSample.severalSystems.Main $),因此无法同时加载它们;此外,它们必须用相同名称的文件(Main $ .class)写在同一目录中。
我更好奇为什么你的第二个例子不会产生错误 - 但它肯定与你的两个对象有关,这两个对象不仅具有相同的名称,而且完全相同。