Я пытаюсь использовать какой-то существующий код с новым проектом 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, так что это очень вероятно, что я что-то очевидное здесь отсутствует. Заранее спасибо!
В сообщении об ошибке указано, что '_root_ не может быть импортирован'. Что произойдет, если вы разместите классы 'Engine' и' ScalaPlayEngine' в правильном пакете вместо их в корневом пакете? ('src/main/scala' не считается пакетом) – jqno
@jqno Я добавил пакет« мусор »(' src/main/scala/garbage'), и он начал работать. Вы знаете, почему это не работает без этой промежуточной упаковки? Большое вам спасибо, кстати. Если вы опубликуете это как ответ, я приму это. – Vikram
Рад, что это сработало! Я отправил ответ. – jqno