【发布时间】:2017-05-16 09:16:00
【问题描述】:
我正在尝试将一些现有代码用于新的 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 都很陌生,所以我很可能在这里遗漏了一些明显的东西。提前致谢!
【问题讨论】:
-
错误消息显示
_root_ cannot be imported。如果您将Engine和ScalaPlayEngine类放在适当的包中,而不是将它们放在根包中,会发生什么情况? (src/main/scala不算一个包) -
@jqno 我添加了一个包“垃圾”(
src/main/scala/garbage),它开始工作了。你知道为什么没有那个中间包它就不能工作吗?顺便说一句,非常感谢。如果您将此作为答案发布,我会接受。 -
很高兴它成功了!我已经发布了答案。
标签: scala intellij-idea playframework sbt