正确地将SBT子项目添加到Scala Play项目

时间:2017-01-02 09:05:03

标签: scala intellij-idea playframework sbt

我正在尝试利用新的Scala Play项目利用一些现有代码。我正在尝试通过按照here的说明将现有项目作为子项目添加到我的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无法找到导入EngineScalaPlayEngine的方法(两个对象都来自我的子项目)。我可以通过导入以下内容来“欺骗”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 个答案:

答案 0 :(得分:2)

您的错误消息显示为:Compilation error[_root_ cannot be imported]

根据Scala Language Specification, Section 9.2

  

假设包装外的顶级定义被注入特殊的空包中。该包无法命名,因此无法导入。但是,空包装的成员在没有资格的情况下彼此可见。

事实上,您的课程EngineScalaPlayEngine并不住在一个包中(src/main/scala并不算作一个包)。如果你将它们移动到一个合适的包装,它应该可以工作。