我正在尝试利用新的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无法找到导入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都很陌生,所以我很可能会错过这里显而易见的东西。提前谢谢!
答案 0 :(得分:2)
您的错误消息显示为:Compilation error[_root_ cannot be imported]
根据Scala Language Specification, Section 9.2:
假设包装外的顶级定义被注入特殊的空包中。该包无法命名,因此无法导入。但是,空包装的成员在没有资格的情况下彼此可见。
事实上,您的课程Engine
和ScalaPlayEngine
并不住在一个包中(src/main/scala
并不算作一个包)。如果你将它们移动到一个合适的包装,它应该可以工作。