【问题标题】:Maven multi-module: aggregate common dependencies in a single one?Maven 多模块:将常见依赖项聚合在一个模块中?
【发布时间】:2011-08-30 12:22:35
【问题描述】:

我已经搜索过这样的问题,但没有找到任何东西,所以我开始了。

我有一个多模块 Maven 项目。多个模块都继承同一个父级,其中定义了公共依赖项。其中,有一个我自己的模块,一个“通用”模块,实现了一些通用功能。

我的问题是:对于常见的依赖项,更好的做法是什么:像我目前所做的那样,在父项中明确定义它们?或者在其他模块引用的“通用”模块中定义它们,然后依赖传递性(例如通用依赖项的单入口点)?

【问题讨论】:

    标签: maven dependencies multi-module


    【解决方案1】:

    最好在你的父 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>
    

    然后你就可以从其他子模块中引用你的公共子模块了。

    【讨论】:

    • 请注意,依赖管理是病毒式的。 IE。如果 A -> B、A -> C:1.0 和 B -> C:2.0 通过依赖管理,那么在构建 A 时,您将获得 C:2.0 而不是 C:1.0,正如您对典型的期望传递依赖规则。为了得到你想要的版本,A 必须使用依赖管理来强制它为 C:1.0。因此:病毒式传播。
    • 是的,我知道dependencyManagement 标记,但我认为它更多是在项目中强制执行依赖项版本的一种手段,没有容易出错的冗余。但是,您仍然需要在每个模块中自行声明依赖项。我宁愿考虑 all (或几乎)模块共享一些依赖项的情况:无论版本如何,在父项中定义那些 global 依赖项是否更好?像我目前所做的那样)或为该特定目的创建一个模块,所有其他模块都依赖于该模块?
    • 我如上所述使用dependencyManagement,并将每个模块的依赖项放在模块级别的POM中,除非依赖项始终是100%的模块......然后我把它放在父POM中。不要在父 POM 中放置每个子 POM 都不需要的依赖项,并且绝对不要创建项目只是为了引入依赖项。在子模块之间重复这些依赖关系并不是什么大问题,因为您不需要提供版本,因为父模块中的dependencyManagement 节会为您执行此操作。
    【解决方案2】:

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

    • 在公共模块中声明公共依赖项
    • 使用import scope

    当您有多个模块依赖于相同的大型组件堆栈以及它们自己的依赖项时,第二个选项很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多