我试图利用一些现有的代码用新斯卡拉玩的项目。我试图通过按照说明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玩,所以它很可能我缺少明显的东西在这里。提前致谢!
错误消息说'_root_不能被导入。如果将'Engine'和'ScalaPlayEngine'类放在适当的包中,而不是将它们放在根包中,会发生什么? ('src/main/scala'不算作包) – jqno
@jqno我添加了一个包“garbage”('src/main/scala/garbage'),它开始工作。你知道为什么没有这个中间包,它不起作用吗?顺便谢谢你。如果您将此作为答案发布,我会接受它。 – Vikram
很高兴工作!我已经发布了一个答案。 – jqno