2016-03-04 71 views
1

我有一个多项目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)。什么是可能的方法来避免这种依赖关系,或者是否有处理这种方式的方法。

回答

4

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

你可以合并这2个模块吗?或重新调整类,以便循环依赖消失?

+1

除了入口点,它们大多是独立的。像'foo'需要通过传递'foo'类型的一个参数来调用'bar'的方法。我将它们(类和参数)移动到另一个名为'core'或'root'的模块,并将其作为依赖于这两个模块。 –

0

正如@Augusto所建议的,我已经将我的类重新组织为三个不同的子模块,并更加智能地使用我的依赖注入。这解决了我的问题,并给出了比我最初的抽象更多的抽象。

三个子项目:

  • API(只是界面)
  • 富(取决于API)
  • 栏(取决于API)
  • aaRoot(其中汇集了所有的上面)

FooModule(在我的情况Guice模块),我从API模块结合FooInterfaceFooImplementation(foo模块)。在调用bar模块时,我只是通过FooInterface来使用BarInterface(来自api)。 与bar模块的情况相同。

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