在Maven多模块项目中,如何指定多个模块中所需的依赖项?

时间:2017-08-12 21:34:31

标签: java maven multi-module

我知道多模块Maven项目的目的是每个模块都可以单独编译和构建,也可以从父项单独编译和构建。

假设我的两个three modules需要使用Google Guava库。我是否在两个子模块的POM中指定了依赖关系?如果是这样,“范围”是什么?或者我在父模块中指定依赖项?我需要将番石榴捆绑在我的最终产品中,但我当然不需要两份。

2 个答案:

答案 0 :(得分:2)

我通常在父项目的dependencyManagement中声明所有依赖项,然后在depenencies模块中使用它们,但没有version。版本仅在父项目中声明。

对于scope,我通常不会在父级中声明范围,除非它像JUnit一样非常明显。

  

我是否在两个子模块的POM中指定了依赖关系?

如果直接使用此依赖项,则为是。即使它被包含在传递中。

  

若然,“范围”是什么?

这取决于依赖关系是什么以及如何使用它。番石榴通常是compile

  

或者我在父模块中指定依赖项?

您可以在父级dependencyManagement中声明它,这样您就不必在其他地方指定版本。

但是您通常不会在父模块中声明依赖项,因为它将被所有子模块继承。这通常是一种假设。

  

我需要在我的最终产品中捆绑Guava,但我当然不需要两份。

不会发生。

答案 1 :(得分:1)

  

假设我的三个模块中有两个需要使用Google Guava库。我是否在两个子模块的POM中指定了依赖关系?

这取决于这些模块与你用它们做什么之间的关系;我们称他们为moduleAmoduleB(共享依赖的模块)和moduleC(第三个模块)。

如何部署moduleAmoduleB?每个人都有自己的同一个图书馆副本吗?

  • 例如,如果它们都是独立运行的WAR,那么您需要为每个都提供自己的库副本。
  • 如果它们都是同一个战争中的罐子(可能由moduleC表示),那么你将要为每个人提供scope=provided的依赖关系,并添加第三个具有默认范围的moduleC中的依赖项。
  

或者我在父模块中指定依赖项?

在父模块中指定依赖关系的问题是,moduleC也会拾取依赖关系,这可能不是您想要的。

解决此问题的一种可能性(例如,如果moduleAmoduleB共享很多的依赖项或公共属性或设置),则添加一个共同的父级: / p>

  • moduleAmoduleB的额外父pom / reactor,但不适用于moduleC
  • 这个额外的父pom将与moduleC在树中处于同一级别(因此它将与moduleC具有相同的父级。)
  • 它包含moduleAmoduleB的共同点。