Maven编译具有循环依赖性的多模块项目

时间:2014-08-01 07:34:41

标签: java maven-3

我正在开发我的小OSS项目,我在其中使用Maven作为构建工具。我将项目拆分为较小的子项目以简化开发。因此,我有以下结构:

project
+-- main-module
|   |
|   +- pom.xml
|
+-- submodule1
|   |
|   +- pom.xml
|
+ pom.xml

我的想法是main-module应该提供每个子模块应该实现的接口,以便插入整个应用程序。因此submodule1/pom.xml包含对main-module的编译时依赖性引用。反过来,我还需要能够测试整个应用程序,因此main-module/pom.xml包含对submodule1的测试范围依赖性引用。结果maven拒绝编译项目,说它们包含循环引用。

我的想法是,maven可以首先编译main-module类,因为它不需要任何子模块的编译时依赖,然后它使用main-module的编译类可以编译{{1}的类然后编译submodule1的测试类(以便能够运行测试)。但似乎maven编译器没有考虑依赖的范围,我不知何故需要解决这个问题。

我能看到的唯一解决方案是从main-module移开测试,这对我来说没有意义,因为只有那个模块提供了主要的逻辑。

我的问题 - 除了离开测试之外,还有其他方法解决这个问题吗?或者我对maven-reactor-plugin应该如何工作的理解可能有问题?

2 个答案:

答案 0 :(得分:2)

您可以将所有API移动到自己的模块中,而不是移动测试。然后您的主模块将包含应用程序,您可以自由分发应用程序的API以允许其他人访问它。如果他们想要开发新功能,他们不一定需要你的应用程序的来源。

我认为这是一个更好的风格,因为具有特定功能的子模块现在可以清楚地区分什么是您的应用程序API以及您的应用程序启动/关闭所需的代码等等。

在我看来,这是maven项目应该是什么样子的预期方式。它还坚持单一责任原则。主要模块的职责是启动/关闭等应用程序。 API模块的职责是展示其他开发人员如何访问您的应用程序。另一个子模块为您的应用程序提供了特定的功能。

答案 1 :(得分:1)

我知道这更像是一个评论,但可能会为您提供(不那么漂亮)的解决方案:

您可以将submodule1作为 maven-surefire-plugin 的依赖关系(以便反应堆为forced to build it),然后使用its settings进行播放。 。{childDelegationadditionalClasspathElements