SBT子项目相互依赖

时间:2016-03-04 01:09:17

标签: scala sbt

我有一个多项目SBT构建。有一个没有任何东西的根,它只聚合所有子项目。

lazy val aaRoot = (project in file(".")).settings(commonSettings: _*).settings(
  libraryDependencies ++= appDependencies
).enablePlugins(PlayJava).aggregate(foo, bar)

lazy val foo: Project = (project in file("modules/foo")).settings(commonSettings: _*).settings(
  libraryDependencies ++= appDependencies
).enablePlugins(PlayJava).dependsOn(bar)

lazy val bar = (project in file("modules/bar")).settings(commonSettings: _*).settings(
  libraryDependencies ++= appDependencies
).enablePlugins(PlayJava).dependsOn(foo)

这显然是循环依赖(foo取决于barbar取决于foo)。有哪些方法可以避免这种依赖,或者有SBT方法来处理这种情况。

2 个答案:

答案 0 :(得分:4)

我所知道的构建工具都没有允许循环依赖...而且根据我的经验,这是应用程序或模块设计问题的症状,而不是工具中的“缺失”功能。当在同一模块/ jar中的包级别发生这种情况时,它甚至被视为坏事。

你能合并这2个模块吗?或者重新调整类以使循环依赖性消失?

答案 1 :(得分:0)

正如@Augusto建议的那样,我已经将我的类重组为三个不同的子模块,并且更明智地使用我的依赖注入。这解决了我的问题,并提供了比我最初的抽象更多的抽象。

三个子项目:

  • api(Just interfaces)
  • foo(取决于api)
  • bar(取决于api)
  • aaRoot(聚合以上所有内容)

FooModule(在我的情况下为Guice模块)中,我将FooInterface从api模块绑定到FooImplementation(foo模块)。在调用bar模块时,我只需通过BarInterface来使用FooInterface(来自api)。 与bar模块的情况相同。

在运行时,它们都可用,并且可以轻松解决。