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

Posted

技术标签:

【中文标题】无法使用 sbt 运行简单的 akka 示例【英文标题】:Failed to run simple akka sample using sbt 【发布时间】:2013-10-19 05:37:09 【问题描述】:

我只是在关注 akka 示例,但无法运行该程序。

    我已经使用 homebrew(OSX Mountail Lion) 安装了 akka、sbt(0.13)、scala(2.10.3) 创建名为 akka_test 的空目录 创建build.sbt和Hello.scala文件 在 akka_test 目录下运行 sbt,compile 命令运行良好 sbt 的 run 命令报错未检测到主类

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

这是我的代码

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
  

【问题讨论】:

试用 Typesafe Activator 和 Hello Akka 教程:akka.io/downloads 【参考方案1】:

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

sbt "run-main akka.Main HelloWorld"

【讨论】:

在我的 sbt 上它失败并显示消息“预期的空白字符”。它接受的版本sbt "run-main akka.Main HelloWorld"(带引号)。【参考方案2】:

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 是一个很好的例子,说明它在实践中的样子(并且还有一些其他有用的东西)

【讨论】:

【参考方案3】:

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

sbt "run-main akka.Main com.foo.bar.HelloWorld"

【讨论】:

以上是关于无法使用 sbt 运行简单的 akka 示例的主要内容,如果未能解决你的问题,请参考以下文章

使用 sbt 和 Akka 微内核运行应用程序

如何在 sbt-native-packager Akka 构建中包含 sigar 本机库?

构建 deb 包时无法使用 sbt-native-packager 打包 cron 作业

无法使用 sbt 在本地运行 spark 作业,但可以在 IntelliJ 中运行

使用 Eclipse 设置 Akka

如何在scala中自动重新运行sbt项目