2017-08-12 129 views
2

我知道多模块Maven项目的意图是每个模块都可以独立编译和构建,也可以从父级统一构建。在Maven多模块项目中,如何指定多个模块中所需的依赖关系?

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

+0

在这种情况下,常见的做法是在父模块中使用'dependencyManagement'并在那里添加Guava依赖项。在子模块中,您将依赖关系添加到番石榴而没有版本和范围(这将由父项处理)。这将防止具有不同版本的库的不同模块。如果您的模块生成两个单独的JAR,AFAIK无法对maven说不生成“两个副本”的依赖关系。如果它是一个web模块,它不会创建副本.... –

+0

我不认为你需要担心它,因为即使你在同一个jar的classpath中有两个副本,其中一个会在加载时被忽略。 –

回答

1

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

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

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

如果你直接使用这种依赖关系,然后是。即使它会被包含在内。

如果是这样,什么“范围”?

这依赖于依赖是什么,以及你如何使用它。番石榴通常是compile

或者我指定父模块的依赖?

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

但你通常不会宣布父模块的依赖,因为它会被所有子模块继承。这通常是一个假设。

我需要番石榴捆绑在我的最终产品,但我当然不需要两个副本。

不会发生。

1

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

这取决于这些模块之间的关系和你对它们做了什么;我们称之为moduleA,moduleB(共享依赖关系的模块)和moduleC(第三个模块)。如何部署moduleAmoduleB?是否有意义,每个都有自己的同一个库的副本?

  • 例如,如果它们都是独立运行的WAR,则需要为每个自己的库提供一份副本。
  • 如果他们是在同一场战争(可能由moduleC表示)结束了两罐子,那么你会希望他们每个人给的依赖与scope=provided,并添加第三依赖于moduleC使用默认范围。

还是我指定父模块的依赖关系?

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

一种可能性来解决这个(例如,如果moduleAmoduleB份额很大的依赖性,或共同属性或设置的)是添加共同的父:

  • 一个额外的父POM /反应器,用于moduleAmoduleB,但不是moduleC
  • 这个额外的父pom将与树moduleC(因此它将有相同的父母moduleC)在同一级别。
  • 它将包含任何moduleAmoduleB有共同之处。
+0

我没有看到第三个子模块获取依赖关系(好)。在父类中,我使用'groupid','artifactid'和'version'来指定依赖项。在两个子模块的每一个中,我省略了'version'。 IntelliJ'Maven'面板显示两个子模块中的每一个都带有Guava库的副本,但不包含第三个子模块(好)。在我构建的Vaadin 8(Java Servlet)项目的WEB-INF/lib'文件夹中,我找到只有一个Guava的库的列表。所以我认为这对我来说已经足够了。但是我还没有在每个模块中实现单元测试。 –

+0

对不起,我不知道我理解100%。如果3个模块共享一个依赖项时,只有其中的2个拥有该依赖项,则最终只会在'WEB-INF/lib'中有一个jar,因为依赖项在所有3种情况下都具有相同的名称,所以只有其中一个会“赢”(其他两个副本由于文件具有完全相同的名称而被覆盖)。 – Andrei

+0

我指的是有关在父模块中指定依赖关系的部分。如果该子模块的POM具有指定的“”,但子模块仅在中间阶段获得副本('IntelliJ'>'Maven Projects'>'my-sub-module'>'Dependencies'),但省略版本数字(其中父母POM指定'')。 –

相关问题