dependencyManagement
和dependencies
什么区别?我已经在 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>