协慌网

登录 贡献 社区

Maven 中 dependencyManagement 和依赖关系之间的区别

dependencyManagementdependencies什么区别?我已经在 Apache Maven 网站上看到了这些文档。似乎可以在依赖项管理下定义的dependencyManagement在其子模块中使用,而无需指定版本。

例如:

父项目(专业人士)在 dependencyManagement 下定义了一个dependencyManagement

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

然后,在 Pro-par 的子级中,我可以使用 junit:

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

但是,我想知道是否有必要在父 pom 中定义 junit 吗?为什么不直接在所需的模块中定义它?

答案

对于这个问题,我的看法很晚了,但是我认为这比被接受的答案更明确(这是正确的,但不强调您需要推论的实际重要部分)。

在父 POM 中, <dependencies><dependencyManagement>之间的主要区别是:

  • <dependencies>部分中指定的工件将始终作为子模块的依赖项包括在内。

  • <dependencyManagement>部分中指定的工件<dependencies>部分中指定,则它们将仅包含在子模块中。你问为什么好?因为您在父级中指定版本和 / 或范围,所以在子 POM 中指定依赖项时可以将其忽略。这可以帮助您将统一版本用于子模块的依赖性,而无需在每个子模块中指定版本。

依赖关系管理允许整合和集中管理依赖关系版本,而无需添加所有子级都继承的依赖关系。当您有一组项目(即多个项目)继承同一个父对象时,此功能特别有用。

另一个非常重要的用例dependencyManagement是传递依赖用于文物的版本控制。没有示例就很难解释这一点。幸运的是,在文档中对此进行了说明。

Maven 网站上的文档非常糟糕。 dependencyManagement 所做的只是将依赖项定义(版本,排除项等)移动到父 pom,然后在子 pom 中,您只需要放置 groupId 和 artifactId。就是这样(除了父 pom 链之类的东西之外,但这也不是很复杂的 - dependencyManagement 胜过了父级的依赖关系 - 但是如果对此或导入有疑问,那么 Maven 文档会更好一些)。

在阅读了 Maven 网站上的所有'a','b','c' 垃圾并感到困惑之后,我重新编写了他们的示例。因此,如果您有两个项目(proj1 和 proj2)共享一个公共依赖项(betaShared),则可以将该依赖项移至父 pom。在使用它的同时,还可以向上移动任何其他依赖项(alpha 和 charlie),但前提是对您的项目有意义。因此,对于前面句子中概述的情况,这是在父 pom 中使用 dependencyManagement 的解决方案:

<!-- ParentProj pom -->
<project>
  <dependencyManagement>
    <dependencies>
      <dependency> <!-- not much benefit defining alpha here, as we only use in 1 child, so optional -->
        <groupId>alpha</groupId>
        <artifactId>alpha</artifactId>
        <version>1.0</version>
        <exclusions>
          <exclusion>
            <groupId>zebra</groupId>
            <artifactId>zebra</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>charlie</groupId> <!-- not much benefit defining charlie here, so optional -->
        <artifactId>charlie</artifactId>
        <version>1.0</version>
        <type>war</type>
        <scope>runtime</scope>
      </dependency>
      <dependency> <!-- defining betaShared here makes a lot of sense -->
        <groupId>betaShared</groupId>
        <artifactId>betaShared</artifactId>
        <version>1.0</version>
        <type>bar</type>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

<!-- Child Proj1 pom -->
<project>
  <dependencies>
    <dependency>
      <groupId>alpha</groupId>
      <artifactId>alpha</artifactId>  <!-- jar type IS DEFAULT, so no need to specify in child projects -->
    </dependency>
    <dependency>
      <groupId>betaShared</groupId>
      <artifactId>betaShared</artifactId>
      <type>bar</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
  </dependencies>
</project>

<!-- Child Proj2 -->
<project>
  <dependencies>
    <dependency>
      <groupId>charlie</groupId>
      <artifactId>charlie</artifactId>
      <type>war</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
    <dependency>
      <groupId>betaShared</groupId> 
      <artifactId>betaShared</artifactId> 
      <type>bar</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
  </dependencies>
</project>