1

我有一个包含三个模块的项目。从另一个模块扩展特质

  • 主要
  • 基础设施

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

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

快乐任何形式的反馈! 感谢

+0

在IntelliJ中编译器出现错误,或者运行“sbt compile” ? –

+0

@RadoBuransky编译器没有错误。那么如果我添加“扩展EntityRepository”它会失败,因为EntityRepository无法找到。我的意思是,我无法在EntityRepositoryImpl类中导入该特征。 – raxelsson

+0

这就是我所问的。错误消息是来自IntelliJ还是SBT。这可能是IntelliJ项目不是最新的。运行“sbt gen-idea”(如果您使用该插件)从build.sbt重新生成IntelliJ项目。 –

回答

1

你的项目设置允许您访问EntityRepository特点是在任何地方domain子项目在infra子项目因为infra取决于domain。您只需按全名引用EntityRepository或导入其所在的软件包(import com.example.EntityRepository)。

如果您使用IntelliJ,则可以使用sbt-idea插件从sbt为其生成项目。 Eclipse与sbteclipse-plugin一样。通过这种方式,您生成的IDE项目可以正确引用对方,并帮助您找到您的课程。

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

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

+0

感谢您的回答@Aleksey。 你的意思是“你可以使用sbt-idea插件使用sbt为其生成项目”? 该项目是理想化的玩法,但问题是我不能在Infra模块中使用EntityRepository。这全是红色的,不会给我任何进口建议。 当我尝试导入模块时,找不到任何东西。 但我做了什么应该工作呢? – raxelsson

+0

编辑我的文章与一些图像 – raxelsson

+0

最好的测试是无论如何写这段代码,即使它不用IntelliJ编译,然后在sbt shell运行';干净;编译“,看它是否编译。如果您进行任何SBT相关更改,请不要忘记重新加载sbt。如果你在''gen-idea'中使用'sbt-idea'插件,你可能还必须从sbt重新生成IntelliJ项目。请让我们知道,如果sbt能够编译所有项目。 –