75

我通常会<dependencyManagement>parent-project/pom.xml. 本<dependencyManagement>节包含我的子模块的所有依赖项的声明和版本,如下所示(即没有<scope>元素):

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
    </dependency>
  </dependencies> 
</dependencyManagement>

在所有子模块(即 moduleX/pom.xml)中,我有:

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

显然,在这个例子中,我<scope>test</scope>对同一个依赖项重复了多次(在每个需要 junit 的子模块中一次)。

我的问题是:关于声明
的最佳做法是什么? 放在里面比较好? 还是将它放在子模块的部分中更好(就像在这篇文章中一样)?为什么? 这个问题有确定的答案吗? <scope>
<dependencyManagement>
<dependencies>

4

4 回答 4

60

聚会有点晚了,但我会加两分钱。

我最近遇到了一个非常难以调试的问题。
我有一个父 pom 用于管理跨多个项目的依赖项。我设置了所有常见的依赖项,包括,groupId和最常见的. 我的想法是,如果每个项目的实际依赖项部分符合最常见的. 当其中一些依赖项显示为传递依赖项时,就会出现问题。例如,如果:artifactIdversionscope
scope

  • A 在编译范围内依赖于 B。
  • B 在编译范围内依赖于 C。
  • C 设置dependencyManagement为 parent 的提供。

然后确定提供了A对C的传递依赖。我不确定这是否有意义,但这确实令人困惑。

无论如何,省去你的麻烦,并离开scope你的dependencyManagement.

于 2013-12-23T19:36:02.503 回答
32

dependencyManagement只是在这里定义所有项目子模块的依赖版本,本节中唯一相关的范围是importBOM。

范围必须在dependencies节中定义。

(对于给定的依赖,它决定了使用上下文。它只允许在需要执行时才包含依赖。例如,ear 不会与 Java-ee 依赖(范围 provided)一起打包,因为它会在目标服务器上找到它们.)

[编辑]

第一条语句有一个例外,节中的范围provideddependencyManagement覆盖节中定义的范围dependencies。请参阅DependencyManagement 以强制范围

于 2013-03-05T10:32:14.640 回答
4

与其他答案一样,最佳实践是从 dependencyManagement 中排除范围,并在定义依赖项时明确指定它。极少数情况下,您希望在不同范围内使用相同依赖项的不同版本,例如,在编译应用程序时使用一个版本,而在运行应用程序时使用不同版本——我能想到的唯一情况是您想显式运行您的测试不同版本的库,以防用户使用该版本而不是您指定的版本。

如果您在dependencyManagement 中定义范围,它将将该版本的使用限制为仅定义的范围——因此任何其他范围都将选择依赖项的随机版本。我昨天在dependencyManagement 中定义了junit 4.12 时遇到了这个问题,但是我们的通用测试框架模块使用的是带有编译范围的junit,所以它选择了4.8.2 版本。

于 2015-02-25T17:01:19.413 回答
2

对于任何范围,将单个依赖项添加到依赖项管理中都没有任何好处。你所拥有的只是复制品。如果您希望版本可配置,请添加一个属性并在您的依赖项中使用它:

<properties>
        <junit.version>4.10</junit.version> 
    ...
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
    </dependency>
</dependencies>

但是,在某些情况下,依赖管理会大放异彩——当您使用boms以便为更大的工件集合编排版本时,例如使用 Java EE 实现的某个版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.bom</groupId>
            <artifactId>jboss-javaee-6.0-with-tools</artifactId>
            <version>${javaee6.with.tools.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
....
于 2013-03-05T10:30:06.960 回答