2012-04-23 68 views
1

我有以下结构的几个项目:项目A,B,C行家循环依赖+继承最佳实践

他们都在d文件夹下的pom.xml父项目D.:

<module>A</module> 
<module>B</module> 
<module>C</module> 

它们之间的依赖关系是这样的:一个< --B < --C。

而A,B,C正在共享许多常见的依赖关系。

1.什么是组织为了让子劲歌在这种情况下,依赖最好的做法很轻,也重复的依赖被排除在外?

2.什么应该被放入“依赖关系”部分,哪些应该被放入父POM的“依赖管理”部分?

3.common依赖更像是:

log4j, slf4j, thrift, jetty, javax.servlet etc... 

他们大多是其他比我的项目需要直接传递依赖。将它们放在父D的pom.xml中作为依赖关系是否有意义,让子项目(A,B,C)从D继承它们?我注意到,如果你这样做,mvn依赖:树会给你警告。

[WARNING] Unused declared dependencies found: log4j, slf4j .... 

如果这给了我警告,我认为这是maven不建议你做的事情?

回答

3
  1. 最重要:只声明模块直接需要的依赖关系。如果不知道更多关于模块及其依赖关系的信息,很难提出具体的建议。您的案例中常见依赖性的示例是什么?也许重新组织模块有助于减少常见的依赖关系。根据项目可能是合理的把所有课程从您的模块A,B和C依赖于同一工件进入一个新的模块E.
  2. 在我看来没有什么应该被放入父POM依赖关系部分(并看到警告,似乎maven感觉一样;-))。至少将在多个模块中使用的所有依赖项版本放入父项的dependency-management部分。这有助于始终保持与整个项目相同的特定依赖版本。
  3. 作为2只应在父你的依赖管理部分指定这些文物的版本,并重复他们需要它,而不指定版本的每个模块中。如1所述,您只应指定直接依赖关系。例如,如果您使用的是slf4j,则只需要在包含主类的模块中使用log4j。

综上所述:

  • 只声明一个模块的直接依赖,传递依赖自动Maven的(这是使用Maven所有的主要原因之一)来处理。
  • 只声明所需的依赖关系:例如对于slf4j,您只需要一个模块,具体取决于slf4j-log4j12,所有其他模块只需要依赖slf4j-api。
  • 在父pom中定义版本,以便所有子模块使用相同的版本。在这样的dependencyManagement部分操作:

     
    <dependencyManagement> 
        <dependencies> 
         <dependency> 
          <groupId>org.slf4j</groupId> 
          <artifactId>slf4j-api</artifactId> 
          <version>1.6.4</version> 
         </dependency> 
        </dependencies> 
    </dependencyManagement> 
    

  • 指定每个模块的模块都直接依赖POM,但没有版本是这样的:

     
    <dependencies> 
        <dependency> 
         <groupId>org.slf4j</groupId> 
         <artifactId>slf4j-api</artifactId> 
        </dependency> 
    </dependencies> 
    

处理很多是依赖由很多模块共享,您也可以使用此方法:创建一个新的“依赖关系收集模块”(我们称之为X),该模块不做任何事情,但依赖于每个需要的工件。现在每个模块只需要依靠X自动依赖它的依赖关系。我不推荐这种方法,因为(除其他原因外)现在每个模块都依赖于X中的依赖关系,并且您无法确定如果从X删除依赖项会发生什么情况,并且您需要查看多个pom才能找到模块直接依赖。

希望这有点帮助:-)

+0

我编辑了我的问题,并把一些例子常见的依赖例子。所以你说最好在父pom中声明依赖关系,并且在没有声明版本的情况下反复将它们作为子pom的依赖关系? – Shengjie 2012-04-24 08:32:43

+0

@ Shengjie我更新了我的答案并添加了“总结”部分。是的,至少我更喜欢这样做。但也许有人更喜欢另一种处理依赖关系的方法。这当然不是唯一真正的单一方式... ;-) – siegi 2012-04-24 19:10:46