dependencyManagement和范围

时间:2013-03-05 10:20:53

标签: maven dependency-management

我通常会在<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 个答案:

答案 0 :(得分:44)

派对有点晚了,但我要加两分钱。我最近遇到了一个非常难以调试的问题。我有一个父pom来管理多个项目的依赖关系。我设置了它们之间共有的所有依赖项,包括groupId,artifactId,version和最常见的范围。我的想法是,如果它与最常见的范围一致,我就不必在每个项目的实际依赖关系部分中包含范围。当某些依赖项显示为传递依赖项时,会出现问题。例如,如果

  • A取决于编译范围内的B
  • B取决于编译范围内的C
  • C设置为在父
  • 的dependencyManagement中提供

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

无论如何,为自己省去麻烦,并将范围从您的依赖管理中移除。

答案 1 :(得分:19)

dependencyManagement仅用于定义所有项目子模块的依赖关系版本,本节中唯一相关的范围是BOM的import

范围必须在dependencies部分中定义。

(对于给定的依赖项,它确定使用上下文。它允许仅在需要执行时包含依赖项。例如,ear不会与Java-ee依赖项打包(范围{{1}因为它会在目标服务器上找到它们。)

[edit]

第一个语句有一个例外,provided部分中的范围provided将覆盖dependencyManagement部分中定义的范围。见DependencyManagement to force scope

答案 2 :(得分:3)

与其他答案一样,最佳做法是从dependencyManagement中排除范围,并在定义依赖关系时明确指定范围。在极少数情况下,您需要在不同范围内使用相同依赖项的不同版本,例如,在编译应用程序时使用一个版本,在运行应用程序时使用不同版本 - 我能想到的唯一情况是您希望明确运行如果用户使用该版本而不是您指定的版本,则针对库的不同版本进行测试。

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

答案 3 :(得分: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>
....