无法使用sbt运行简单的akka​​示例

Hon*_*oon 8 scala sbt akka

我只是关注akka样本但无法运行该程序.

  1. 我用自制软件(OSX Mountail Lion)安装了akka,sbt(0.13),scala(2.10.3)
  2. 制作名为akka_test的空目录
  3. 创建build.sbtHello.scala文件
  4. 在akka_test目录中运行sbt并且编译命令运行良好
  5. sbt的运行命令抱怨没有检测到主类

我该怎么做才能运行该程序?

这是我的代码

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"
Run Code Online (Sandbox Code Playgroud)

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
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 13

sbt具有run-main从命令行接受主类的命令,因此完整命令是

sbt "run-main akka.Main HelloWorld"
Run Code Online (Sandbox Code Playgroud)


waf*_*dox 5

sbt run查找"主"类,即具有def main(args: Array[String])或扩展特征的类App.由于那不能是一个actor,你需要启动一个系统并使用它来启动HelloWorld,所以类似于:

class HelloWorldMain {
    def main(args: Array[String]) {
        import akka.actor.ActorSystem
        val system = ActorSystem("HelloWorld")
        val helloWorldActor = system.actorOf(Props[HelloWorld] ...)
        // ... Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

由于系统只运行直到你关闭它们,如果你想要你的主类停止你要么必须使用期货通过akka.pattern.ask并且在你收集它们之后系统终止或者设置一个单独的收割者演员来为你杀死系统. 这篇文章有关于如何做到一点的更多信息,这个拉取请求是一个很好的例子,它在实践中看起来如何(并且还有一些其他有用的东西)