2017-01-02 124 views
1

我试图利用一些现有的代码用新斯卡拉玩的项目。我试图通过按照说明here将现有项目添加为我的Scala Play项目的子项目来做到这一点。适当添加一个SBT子项目到斯卡拉播放项目

但是,我无法弄清楚如何从父项目访问子项目的对象。例如,我试图创建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.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) 

我的父(斯卡拉播放)项目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玩,所以它很可能我缺少明显的东西在这里。提前致谢!

+1

错误消息说'_root_不能被导入。如果将'Engine'和'ScalaPlayEngine'类放在适当的包中,而不是将它们放在根包中,会发生什么? ('src/main/scala'不算作包) – jqno

+0

@jqno我添加了一个包“garbage”('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.

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

相关问题