2017-01-02 4 views
1

Я пытаюсь использовать какой-то существующий код с новым проектом Scala Play. Я пытаюсь сделать это, добавив существующий проект в качестве подпроекта в проект Scala Play, выполнив следующие инструкции: here.Правильное добавление подпроекта SBT в проект Scala Play

Однако я не могу понять, как получить доступ к объектам в подпроекте из родительского проекта. Например, я пытаюсь создать одноэлементный объект Scala Play, который предоставляет экземпляр объекта из подпроекта.

package services 
import javax.inject.Singleton 

@Singleton 
class EngineProvider { 

    var instance: Engine = _ 

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

Однако мой Intellij не может найти способ импорта Engine или ScalaPlayEngine (оба объекта из моего подпроекта). Я могу «трюк» IntelliJ в удалении это ошибка, импортируя следующее:

import _root_.Engine 
import _root_.ScalaPlayEngine 

Но когда я на самом деле пытаюсь запустить проект Play, я все еще получаю ошибку:

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) 

Моего родитель (Scala проект Play) build.sbt файл содержит следующее:

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

lazy val engine = project 

, так что я бы ожидал, чтобы быть в состоянии выбрать любые объекты из подпроекта (так как она зависит от него). Моя структура проекта выглядит следующим образом:

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

Я очень новой для обоих SBT и Scala Play, так что это очень вероятно, что я что-то очевидное здесь отсутствует. Заранее спасибо!

+1

В сообщении об ошибке указано, что '_root_ не может быть импортирован'. Что произойдет, если вы разместите классы 'Engine' и' ScalaPlayEngine' в правильном пакете вместо их в корневом пакете? ('src/main/scala' не считается пакетом) – jqno

+0

@jqno Я добавил пакет« мусор »(' src/main/scala/garbage'), и он начал работать. Вы знаете, почему это не работает без этой промежуточной упаковки? Большое вам спасибо, кстати. Если вы опубликуете это как ответ, я приму это. – Vikram

+0

Рад, что это сработало! Я отправил ответ. – jqno

ответ

2

Ваше сообщение об ошибке говорит: Compilation error[_root_ cannot be imported]

Согласно 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.

И действительно, ваши классы Engine и ScalaPlayEngine не живут в пакете (src/main/scala не учитывается как пакет). Если вы переместите их в соответствующий пакет, он должен работать.

 Смежные вопросы

  • Нет связанных вопросов^_^