我只是关注akka样本但无法运行程序。
我该怎么做才能运行程序?
这是我的代码
build.sbt
name := "My Project"
version := "1.0"
scalaVersion := "2.10.2"
resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"
libraryDependencies +=
"com.typesafe.akka" %% "akka-actor" % "2.2.1"
Hello.scala
import akka.actor.Actor
import akka.actor.Props
class HelloWorld extends Actor {
override def preStart(): Unit = {
// create the greeter actor
val greeter = context.actorOf(Props[Greeter], "greeter")
// tell it to perform the greeting
greeter ! Greeter.Greet
}
def receive = {
// when the greeter is done, stop this actor and with it the application
case Greeter.Done ⇒ context.stop(self)
}
}
object Greeter {
case object Greet
case object Done
}
class Greeter extends Actor {
def receive = {
case Greeter.Greet ⇒
println("Hello World!")
sender ! Greeter.Done
}
}
答案 0 :(得分:13)
sbt有run-main
命令,它从命令行接受主类,
所以完整的命令是
sbt "run-main akka.Main HelloWorld"
答案 1 :(得分:5)
sbt run查找“主”类,即具有def main(args: Array[String])
的类或扩展特征App
。由于那不能是一个演员,你需要启动一个系统并使用它来启动HelloWorld,所以像这样:
class HelloWorldMain {
def main(args: Array[String]) {
import akka.actor.ActorSystem
val system = ActorSystem("HelloWorld")
val helloWorldActor = system.actorOf(Props[HelloWorld] ...)
// ... Do stuff
}
}
由于系统只运行直到你关闭它们,如果你希望你的主类停止,你要么必须通过akka.pattern.ask
使用期货,并在收集它们或设置一个单独的收割机后让系统终止演员为你杀死系统。 This post有更多关于如何做到这一点的信息,this pull request是一个很好的例子,说明它在实践中的表现(并且还有一些其他有用的东西)
答案 2 :(得分:4)
如果您有包裹,则需要添加路径。
例如,如果你有包com.foo.bar
(您的HelloWorld位于./youProject/src/main/scala/com/foo/bar)
然后命令将是:
sbt "run-main akka.Main com.foo.bar.HelloWorld"