2017-01-02 3 views
1

Ich versuche, vorhandenen Code mit einem neuen Scala Play-Projekt zu kombinieren. Ich versuche dies zu tun, indem ich das existierende Projekt als ein Unterprojekt zu meinem Scala Play Projekt hinzufüge, indem ich die Anweisungen here befolge.Richtiges Hinzufügen eines SBT-Unterprojekts zu einem Scala Play-Projekt

Ich bin jedoch nicht in der Lage herauszufinden, wie auf Objekte im Unterprojekt vom übergeordneten Projekt zugreifen. Ich versuche beispielsweise, ein Scala Play Singleton-Objekt zu erstellen, das eine Instanz eines Objekts aus dem Unterprojekt bereitstellt.

package services 
import javax.inject.Singleton 

@Singleton 
class EngineProvider { 

    var instance: Engine = _ 

    def getEngine: Engine = { 
    if (instance == null) { 
     instance = new ScalaPlayEngine() 
    } 
    instance 
    } 
} 

jedoch mein Intellij kann nicht einen Weg zu importieren Engine oder ScalaPlayEngine (beiden Objekte sind aus meinem Teilprojekt) finden. Ich kann „Trick“ Intellij in durch seinen Fehler Entfernen der folgenden Import:

import _root_.Engine 
import _root_.ScalaPlayEngine 

Aber wenn ich versuche tatsächlich das Play-Projekt auszuführen, erhalte ich noch einen Fehler:

play.sbt.PlayExceptions$CompilationException: Compilation error[_root_ cannot be imported] 
     at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) 
     at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) 
     at scala.Option.map(Option.scala:145) 
     at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49) 
     at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44) 
     at scala.Option.map(Option.scala:145) 
     at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44) 
     at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40) 
     at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) 
     at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) 

Meine Eltern (Scala Play) Projekt build.sbt Datei enthält diese:

lazy val root = (project in file(".")) 
    .enablePlugins(PlayScala) 
    .aggregate(engine) 
    .dependsOn(engine) 

lazy val engine = project 

so würde ich es alle Objekte aus dem Teilprojekt in der Lage sein zu erwarten abholen (da es davon abhängt). Meine Projektstruktur sieht ungefähr so ​​aus:

ParentScalaPlayProject 
    build.sbt 
    app 
    services 
     EngineProvider.scala 
    . 
    . 
    . 
    engine (child project) 
    build.sbt 
    src 
     main 
     scala 
      Engine.scala 
      ScalaPlayEngine.scala 
    . 
    . 
    . 

Ich bin sehr neu sowohl SBT und Scala Play, also ist es sehr wahrscheinlich, dass ich etwas offensichtlich hier bin fehlt. Danke im Voraus!

+1

Die Fehlermeldung besagt, dass _root_ nicht importiert werden kann. Was passiert, wenn Sie Ihre "Engine" - und "ScalaPlayEngine" -Klassen in ein richtiges Paket setzen, anstatt sie im root-Paket zu haben? ('src/main/scala 'zählt nicht als Paket) – jqno

+0

@jqno Ich habe ein Paket" Müll "(' src/main/scala/garbage') hinzugefügt und es hat angefangen zu arbeiten. Weißt du, warum es ohne dieses Zwischenpaket nicht geht? Vielen Dank übrigens. Wenn du dies als Antwort postest, werde ich es akzeptieren. – Vikram

+0

Froh, es hat funktioniert! Ich habe eine Antwort geschrieben. – jqno

Antwort

2

Ihre Fehlermeldung sagt: Compilation error[_root_ cannot be imported]

Nach dem Scala Language Specification, Section 9.2:

Top-level definitions outside a packaging are assumed to be injected into a special empty package. That package cannot be named and therefore cannot be imported. However, members of the empty package are visible to each other without qualification.

Und in der Tat, Ihre Klassen Engine und ScalaPlayEngine Leben nicht in einem Paket (src/main/scala zählt nicht als Paket). Wenn Sie sie in ein richtiges Paket verschieben, sollte es funktionieren.

Verwandte Themen