【问题标题】:maven circular dependency + inheritance best practicemaven循环依赖+继承最佳实践
【发布时间】:2012-05-04 07:43:03
【问题描述】:

我有几个项目的结构如下:项目 A、B、C

它们都在一个父项目D下。在D文件夹下的pom.xml中:

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

它们之间的依赖关系是:A

A、B、C 共享许多共同的依赖关系。

1.在这种情况下组织依赖关系的最佳实践是什么,以使子 pom 非常轻,同时排除重复的依赖关系?

2.父pom的“dependencies”部分应该放什么,“dependency-management”部分应该放什么?

3.common 依赖更像是:

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

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

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

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

【问题讨论】:

    标签: maven dependency-management


    【解决方案1】:
    1. 最重要的是:只声明模块直接需要的依赖关系。如果不了解更多有关您的模块及其依赖关系的信息,就很难提出任何具体的建议。在您的案例中,常见依赖项的示例是什么?也许重新组织你的模块有助于减少常见的依赖关系。根据您的项目,将模块 A、B 和 C 中依赖于同一工件的所有类放入新模块 E 中可能是合理的。
    2. 在我看来,不应将任何内容放入父 pom 的依赖项部分(看到警告,maven 似乎也有同样的感觉 ;-))。至少将多个模块中使用的所有版本的依赖项放入父级的依赖项管理部分。这有助于在整个项目中始终保持特定依赖项的相同版本。
    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 找到一个模块的直接依赖关系。

    希望这会有所帮助:-)

    【讨论】:

    • 我编辑了我的问题,并放了一些常见的依赖示例。所以你说最好在父pom中声明依赖,并在子pom中反复将它们作为依赖而不声明版本?
    • @Shengjie 我更新了我的答案并添加了“总结”部分。是的,至少我更喜欢这样做。但也许其他人更喜欢另一种处理依赖关系的方法。这当然不是唯一真实且单一的方法……;-)
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2014-11-07
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多