无法使用 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-native-packager Akka 构建中包含 sigar 本机库?
构建 deb 包时无法使用 sbt-native-packager 打包 cron 作业