我有一个多项目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
取决于bar
而bar
取决于foo
)。有哪些方法可以避免这种依赖,或者有SBT
方法来处理这种情况。
答案 0 :(得分:4)
我所知道的构建工具都没有允许循环依赖...而且根据我的经验,这是应用程序或模块设计问题的症状,而不是工具中的“缺失”功能。当在同一模块/ jar中的包级别发生这种情况时,它甚至被视为坏事。
你能合并这2个模块吗?或者重新调整类以使循环依赖性消失?
答案 1 :(得分:0)
正如@Augusto建议的那样,我已经将我的类重组为三个不同的子模块,并且更明智地使用我的依赖注入。这解决了我的问题,并提供了比我最初的抽象更多的抽象。
三个子项目:
在FooModule
(在我的情况下为Guice
模块)中,我将FooInterface
从api模块绑定到FooImplementation
(foo模块)。在调用bar模块时,我只需通过BarInterface
来使用FooInterface
(来自api)。
与bar
模块的情况相同。
在运行时,它们都可用,并且可以轻松解决。