其中一个Maven的核心特征是依赖管理。管理依赖关系变得困难的任务一旦我们处理多个模块项目(包含数百个模块/子项目)。Maven提供了一个高程度的控制来管理这样的场景。
传递依赖发现
这是很通常情况下,当一个库说甲就依赖于其他库说乙的情况下,另一个项目Ç想用A,则该项目需要使用库中B.
Maven通过读取依赖项目文件(pom.xml中),找出它们的依赖等。
我们只需要在每个项目中POM定义直接依赖关系。Maven自动处理其余部分。
传递依赖,包括库的图形可能会快速增长在很大程度上。可能出现情况下,当有重复的库。Maven提供一些功能来控制传递依赖程度
特征 | 描述 |
---|---|
Dependency mediation(依赖调解) | 确定在遇到多个版本的工件时将使用哪个版本的依赖关系。如果两个依赖版本在依赖关系树中处于相同的深度,则将使用第一个声明的依赖关系。 |
Dependency management(依赖管理) | 直接指定在传递依赖关系中遇到的工件的版本。对于一个例子,项目C可以在其dependencyManagement部分中包含B作为依赖项,并直接控制在被引用时将使用哪个版本的B. |
Dependency scope(依赖范围) | 包含依据当前构建阶段的依赖关系 |
Excluded dependencies(排除的依赖关系) | 任何传递依赖可以用“排除”元素来消除。例如,A取决于B而B取决于C,则A可以将C标记为排除。 |
Optional dependencies(可选的依赖关系) | 任何传递依赖可以使用“可选”元素标记为可选。例如,A取决于B而B取决于C.现在B将C标记为可选的。那么A不会使用C. |
依赖范围
传递依赖发现可以使用各种依赖范围如下文所述受到限制
范围 | 描述 |
---|---|
compile | 这个范围表示依赖在项目的类路径中是可用的。这是默认范围。 |
provided | 这个范围表示依赖是由JDK或者web-Server / Container在运行时提供的。 |
runtime | 这个范围指示编译时不需要依赖关系,但在执行期间是必需的。 |
test | 该范围表示依赖项仅适用于测试编译和执行阶段。 |
system | 此范围表示您必须提供系统路径。 |
import | 这个范围仅在依赖类型为pom时使用。这个范围表示指定的POM应该被POM的<dependencyManagement>部分中的依赖关系替换。 |