2

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

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

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

它们之间的依赖关系是:A<--B<--C。

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

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

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 不建议你做的事情?

4

1 回答 1

4
  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 才能直接找到模块依赖关系。

希望这个对你有帮助 :-)

于 2012-04-23T19:47:44.580 回答