从另一个模块扩展特征

时间:2014-01-27 21:24:55

标签: scala intellij-idea playframework playframework-2.2 multi-module

我有一个包含三个模块的项目。

  • 基础设施

在域模块中,我有一个实体类和一个存储库特征。

Entity.scala EntityRepository

在基础架构模块中,我想扩展并实现EntityRepository特性。

EntityRepositoryImpl extends EntityRepository {...}

但我不知道如何从基础架构模块访问域mobdule中的特征。

我不确定我是否知道我在做什么但是在这里由build.sbt。告诉我,如果我在那里做错了什么。

import play.Project._

lazy val domain = Project("domain", file("domain"))

lazy val infra = Project("infrastructure", file("infrastructure")).dependsOn(domain)

lazy val root = Project("MainModuleName", file(".")).dependsOn(domain, infra)

name := "AppName"

version := "1.0"

playScalaSettings

现在突然我可以在EntityRepositoryImpl中找到EntityRepository但是当我选择扩展它时它仍然是红色并显示“无法解决......” - 错误。

Finds the trait

Still red if I choose it

很高兴获得任何反馈! 感谢

1 个答案:

答案 0 :(得分:1)

您的项目设置允许您从EntityRepository子项目中的任何位置访问domain子项目中的infra特征,因为infra取决于domain。您需要做的就是以全名引用EntityRepository或导入其所在的包(import com.example.EntityRepository)。

如果您使用IntelliJ,您可以使用sbt-idea插件从sbt为其生成项目。使用sbteclipse-plugin的Eclipse也是如此。这样生成的IDE项目就可以相互正确引用,并帮助您找到类。

虽然您在两个不同的SBT子项目中拥有相同的包,但这不是问题。这不应该导致任何编译问题。

为了消除可能由IDE引起的问题,一个好的测试是使用SBT进行编译。关闭运行sbt,重新启动它并在SBT控制台中运行;clean; compile; test。如果所有内容编译都很好(或者即使它没有)从SBT控制台使用gen-idea重新生成IntelliJ项目。对于您的所有SBT命令,您应该在root项目中,当我启动SBT时,我认为该项目是默认位置。