8

我只是在关注 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 的运行命令抱怨没有检测到主类

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

这是我的代码

构建.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"

你好.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
  }
}
4

3 回答 3

13

sbt 有run-main从命令行接受主类的命令,所以完整的命令是

sbt "run-main akka.Main HelloWorld"
于 2013-11-05T13:47:34.357 回答
5

sbt run 查找“主”类,即具有def main(args: Array[String])或扩展 trait的类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并在您收集它们后让系统终止,或者设置一个单独的收割者演员来为您杀死系统。 这篇文章有更多关于如何做到这一点的信息,这个拉取请求是它在实践中的一个很好的例子(并且还有一些其他有用的东西)

于 2013-10-11T08:20:53.993 回答
4

如果你有包,你需要添加路径。例如,如果您有包 com.foo.bar
(您的 HelloWorld 位于 ./youProject/src/main/scala/com/foo/bar),那么命令将是:

sbt "run-main akka.Main com.foo.bar.HelloWorld"
于 2014-01-06T18:38:51.490 回答