2013-10-11 10 views
8

Ich folge nur dem akka-Beispiel, konnte das Programm jedoch nicht ausführen.Fehler beim Ausführen einfacher akka-Beispiele mit sbt

  1. Ich habe installiert akka, sbt (0,13), scala (2.10.3) mit Homebrew (OSX Mountail Lion)
  2. machen leeres Verzeichnis namens akka_test
  3. erstellen build.sbt und Hello.scala Datei
  4. Lauf SBT in akka_test Verzeichnis und Befehl kompilieren funktionierte gut
  5. der sbt Lauf Befehl klagt Keine Hauptkategorie erkannt

Was soll ich tun, um das Programm auszuführen?

hier ist mein Code

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

Versuchen Typesafe Aktivator und das Hello Akka-Tutorial: http://akka.io/downloads/ –

Antwort

5

sbt Lauf sucht nach einer "Haupt" Klasse, das heißt, eine Klasse mit def main(args: Array[String]) oder erstreckt sich die Merkmal App. Da dies kein Schauspieler sein kann, müssen Sie ein System initiieren und die Hello World zu initiieren verwenden, so etwas wie:

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

Da Systeme nur laufen, bis Sie sie heruntergefahren, wenn Sie Ihre Haupt wollen Klasse zu stoppen, müssen Sie entweder Futures über akka.pattern.ask verwenden und das System beenden, nachdem Sie sie sammeln oder einen separaten Reaper-Akteur einrichten, um das System für Sie zu töten. This post weitere Informationen hat, wie das zu tun, und this pull request ist ein gutes Beispiel dafür, wie es in der Praxis aussieht (und hat einige andere nützliche Sachen drin auch)

13

sbt run-main Befehl hat, die von der Kommandozeile Hauptklasse übernimmt, so voll Befehl ist

sbt "run-main akka.Main HelloWorld" 
+0

Auf meinem sbt es mit der Meldung "Expected whitespace character" fehlgeschlagen. Die Version akzeptiert 'sbt" run-main akka.Main HelloWorld "' (mit Anführungszeichen). – pepyakin

4

falls Sie Paket haben Sie den Pfad hinzufügen müssen. Zum Beispiel, wenn Sie Paket com.foo.bar
(Ihre Hello World ist in ./youProject/src/main/scala/com/foo/bar) dann wird der Befehl:

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