我知道多模块Maven项目的目的是每个模块都可以单独编译和构建,也可以从父项单独编译和构建。
假设我的两个three modules需要使用Google Guava库。我是否在两个子模块的POM中指定了依赖关系?如果是这样,“范围”是什么?或者我在父模块中指定依赖项?我需要将番石榴捆绑在我的最终产品中,但我当然不需要两份。
答案 0 :(得分:2)
我通常在父项目的dependencyManagement
中声明所有依赖项,然后在depenencies
模块中使用它们,但没有version
。版本仅在父项目中声明。
对于scope
,我通常不会在父级中声明范围,除非它像JUnit一样非常明显。
我是否在两个子模块的POM中指定了依赖关系?
如果直接使用此依赖项,则为是。即使它被包含在传递中。
若然,“范围”是什么?
这取决于依赖关系是什么以及如何使用它。番石榴通常是compile
。
或者我在父模块中指定依赖项?
您可以在父级dependencyManagement
中声明它,这样您就不必在其他地方指定版本。
但是您通常不会在父模块中声明依赖项,因为它将被所有子模块继承。这通常是一种假设。
我需要在我的最终产品中捆绑Guava,但我当然不需要两份。
不会发生。
答案 1 :(得分:1)
假设我的三个模块中有两个需要使用Google Guava库。我是否在两个子模块的POM中指定了依赖关系?
这取决于这些模块与你用它们做什么之间的关系;我们称他们为moduleA
,moduleB
(共享依赖的模块)和moduleC
(第三个模块)。
如何部署moduleA
和moduleB
?每个人都有自己的同一个图书馆副本吗?
moduleC
表示),那么你将要为每个人提供scope=provided
的依赖关系,并添加第三个具有默认范围的moduleC
中的依赖项。或者我在父模块中指定依赖项?
在父模块中指定依赖关系的问题是,moduleC
也会拾取依赖关系,这可能不是您想要的。
解决此问题的一种可能性(例如,如果moduleA
和moduleB
共享很多的依赖项或公共属性或设置),则添加一个共同的父级: / p>
moduleA
和moduleB
的额外父pom / reactor,但不适用于moduleC
。moduleC
在树中处于同一级别(因此它将与moduleC
具有相同的父级。)moduleA
和moduleB
的共同点。