【问题标题】:Properly adding a SBT subproject to a Scala Play project将 SBT 子项目正确添加到 Scala Play 项目
【发布时间】: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 找不到导入 EngineScalaPlayEngine 的方法(这两个对象都来自我的子项目)。我可以通过导入以下内容来“欺骗”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。如果您将EngineScalaPlayEngine 类放在适当的包中,而不是将它们放在根包中,会发生什么情况? (src/main/scala 不算一个包)
  • @jqno 我添加了一个包“垃圾”(src/main/scala/garbage),它开始工作了。你知道为什么没有那个中间包它就不能工作吗?顺便说一句,非常感谢。如果您将此作为答案发布,我会接受。
  • 很高兴它成功了!我已经发布了答案。

标签: scala intellij-idea playframework sbt


【解决方案1】:

你的错误信息是:Compilation error[_root_ cannot be imported]

根据Scala Language Specification, Section 9.2

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

确实,您的课程EngineScalaPlayEngine 不在一个包中(src/main/scala 不算作一个包)。如果您将它们移动到适当的包中,它应该可以工作。

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2017-03-04
    • 2011-04-17
    相关资源
    最近更新 更多