将SBT子项目正确添加到Scala Play项目
我正试图利用一些现有的代码和一个新的Scala Play项目。我试图通过按照说明将现有项目作为子项目添加到Scala Play项目中来实现这一点 但是,我无法确定如何从父项目访问子项目中的对象。例如,我试图创建Scala Play singleton对象,该对象提供子项目中对象的实例将SBT子项目正确添加到Scala Play项目,scala,intellij-idea,playframework,sbt,Scala,Intellij Idea,Playframework,Sbt,我正试图利用一些现有的代码和一个新的Scala Play项目。我试图通过按照说明将现有项目作为子项目添加到Scala Play项目中来实现这一点 但是,我无法确定如何从父项目访问子项目中的对象。例如,我试图创建Scala Play singleton对象,该对象提供子项目中对象的实例 package services import javax.inject.Singleton @Singleton class EngineProvider { var instance: Engine =
package services
import javax.inject.Singleton
@Singleton
class EngineProvider {
var instance: Engine = _
def getEngine: Engine = {
if (instance == null) {
instance = new ScalaPlayEngine()
}
instance
}
}
但是,我的Intellij找不到导入引擎
或ScalayEngine
(两个对象都来自我的子项目)的方法。我可以通过导入以下内容“诱骗”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都是新手,所以我很可能错过了一些明显的东西。提前谢谢 您的错误消息显示:
编译错误[\u无法导入root]
根据报告:
包装外的顶级定义被假定为注入到一个特殊的空包装中。无法命名该包,因此无法导入。但是,空包的成员彼此可见,没有限制
事实上,您的类
Engine
和scalayengine
并不存在于包中(src/main/scala
不算作包)。如果您将它们移动到适当的包中,它应该可以工作。错误消息显示\u root\u无法导入。如果将引擎
和scalayengine
类放在适当的包中,而不是放在根包中,会发生什么?(src/main/scala
不算包)@jqno我添加了一个包“垃圾”(src/main/scala/garbage
),它开始工作。你知道为什么没有中间包它就不能工作吗?顺便说一下,非常感谢你。如果你把这个作为答案,我会接受的。很高兴它奏效了!我已经发布了答案。