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

时间:2013-10-11 07:55:19

标签: scala sbt akka

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

  1. 我使用自制程序(OSX Mountail Lion)安装了akka,sbt(0.13),scala(2.10.3)
  2. 制作名为 akka_test
  3. 的空目录
  4. 创建build.sbtHello.scala文件
  5. 在akka_test目录中运行sbt并且编译命令运行良好
  6. sbt的运行命令抱怨未检测到主要类
  7. 我该怎么做才能运行程序?

    这是我的代码

    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
      }
    }
    

3 个答案:

答案 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"