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

将SBT子项目正确添加到Scala Play项目,scala,intellij-idea,playframework,sbt,Scala,Intellij Idea,Playframework,Sbt,我正试图利用一些现有的代码和一个新的Scala Play项目。我试图通过按照说明将现有项目作为子项目添加到Scala Play项目中来实现这一点 但是,我无法确定如何从父项目访问子项目中的对象。例如,我试图创建Scala Play singleton对象,该对象提供子项目中对象的实例 package services import javax.inject.Singleton @Singleton class EngineProvider { var instance: Engine =

我正试图利用一些现有的代码和一个新的Scala Play项目。我试图通过按照说明将现有项目作为子项目添加到Scala Play项目中来实现这一点

但是,我无法确定如何从父项目访问子项目中的对象。例如,我试图创建Scala Play singleton对象,该对象提供子项目中对象的实例

package services
import javax.inject.Singleton

@Singleton
class EngineProvider {

  var instance: Engine = _

  def getEngine: Engine = {
    if (instance == null) {
      instance = new ScalaPlayEngine()
    }
    instance
  }
}
但是,我的Intellij找不到导入
引擎
ScalayEngine
(两个对象都来自我的子项目)的方法。我可以通过导入以下内容“诱骗”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都是新手,所以我很可能错过了一些明显的东西。提前谢谢

您的错误消息显示:
编译错误[\u无法导入root]

根据报告:

包装外的顶级定义被假定为注入到一个特殊的空包装中。无法命名该包,因此无法导入。但是,空包的成员彼此可见,没有限制


事实上,您的类
Engine
scalayengine
并不存在于包中(
src/main/scala
不算作包)。如果您将它们移动到适当的包中,它应该可以工作。

错误消息显示
\u root\u无法导入
。如果将
引擎
scalayengine
类放在适当的包中,而不是放在根包中,会发生什么?(
src/main/scala
不算包)@jqno我添加了一个包“垃圾”(
src/main/scala/garbage
),它开始工作。你知道为什么没有中间包它就不能工作吗?顺便说一下,非常感谢你。如果你把这个作为答案,我会接受的。很高兴它奏效了!我已经发布了答案。