2011-05-22 69 views
8

我已经搜索了这样一个问题,但没有找到任何东西,所以我在这里。Maven多模块:聚合公共依赖在一个单一的?

我有一个多模块maven项目。多个模块都会继承相同的父级,其中定义了常见的依赖关系。其中,有一个我自己的模块,一个“普通”模块,其中实现了一些常用功能。

我的问题是:什么是一个更好的习惯常见的依赖关系:定义它们全部明确地在父母,就像我目前做的?或者将它们定义在其他模块引用的“通用”模块中,然后依赖传递性(就像通用依赖关系的单入口点一样)?

回答

14

最好在父pom中使用dependencyManagement标记来定义您的依赖关系及其版本,然后在需要的地方在子模块中引用这些依赖关系。当您的项目中需要其他子模块时(例如,来自其他子模块的公共子模块),则依赖关系将以传递方式发现。例如:

在你的父POM:

<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 

在您共同POM(公告不存在版本或范围):

<dependencies> 
    <dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    </dependency> 
</dependencies> 

然后你可以从引用您共同子模块其他子模块是你已经。

+1

请注意,依赖管理是病毒,但。即如果A - > B,A - > C:1.0和B - > C:2.0通过依赖管理的方式,那么在构建A时,您将得到C:2.0而不是C:1.0,正如您期望的那样传递依赖性规则。为了获得你想要的版本,A必须使用依赖管理来强制它到C:1.0。因此:病毒。 – 2011-07-26 17:25:06

+1

是的,我知道dependencyManagement标记,但我更多地将它看作是在项目中强制执行依赖项版本的一种方式,而不会出现容易出错的冗余。但是,您仍然需要在每个模块中声明它们自己的依赖关系。 我在想**所有**(或几乎)模块共享一些依赖关系的情况:无论版本控制,是在父级定义那些_global_依赖关系(如我目前所做的)还是创建一个更好的做法为了这个特定的目的,所有其他的依赖于这个模块? – Eleaar 2011-07-30 10:39:56

+2

我如上所述使用dependencyManagagement,并将每个模块的依赖关系放在模块级别的POM中,除非依赖关系始终为100%的模块...然后我将它放在父POM中。不要在每个子POM中不需要的父POM中添加一个依赖项,并且绝对不要创建一个项目来引入依赖项。在子模块之间重复这些依赖关系并不重要,因为您不需要提供版本作为父级中的dependencyManagement节来为您执行。 – HDave 2011-09-20 19:49:10

0

我可以看到两个合理的选择:

  • 声明公共依赖于一个共同的模块
  • 使用import scope

第二个选项是有用的,当你有多个模块依赖于同一个大叠的具有自己的依赖关系数量的组件。

相关问题