依赖管理
# 依赖管理
# 依赖配置
依赖指当前项目运行所需的 jar,一个项目可以设置多个依赖格式。
# 依赖传递
# 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
# 依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高(项目依赖树中的位置决定)
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序在后的(前覆盖后)
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的(不同版本,后覆盖前)
# 可选依赖
对外隐藏当前所依赖的资源 -- 不透明
可选依赖(Optional Dependency)是一种依赖管理策略,用于指示某些依赖项不是强制性的,或者在编译时不是必须的,但在运行时可能需要。
这种依赖类型通常用于以下情况:
- 当你的项目依赖于一个库,但只有在某些特定条件下才会使用它。
- 当你想提供向后兼容性,允许使用旧版本的库,但同时支持新版本的功能。
在 Java 的 Maven 构建工具中,可以使用 <optional>
标签来定义可选依赖。
以下是一个 Maven pom.xml
文件中的示例:
<project>
<!-- ... 其他配置 ... -->
<dependencies>
<!-- 必需的依赖项 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>core-lib</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 可选的依赖项 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>optional-lib</artifactId>
<version>2.0.0</version>
<!-- true 默认为 false 不隐藏, 为 true 则对外隐藏 -->
<optional>true</optional>
</dependency>
<!-- ... 其他依赖项 ... -->
</dependencies>
<!-- ... 其他配置 ... -->
</project>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在这个示例中,optional-lib
被标记为可选依赖。这意味着:
- Maven 在构建过程中不会自动将这个依赖项传递给其他依赖这个项目的项目。
- 这个依赖项仅在当前项目中需要时才被包含。
# 排除依赖
主动断开依赖的资源,被排除的资源无需指定版本 -- 不需要 exclusions
(标签)
# 依赖范围
依赖的 jar 默认情况可以在任何地方使用, 可以通过 <scope>
标签设定其作用范围.
作用范围:
主程序范围有效 (main 文件夹范围内)
测试程序范围有效 (test 文件夹范围内)
是否参与打包 (package 指令范围内)
compile(默认):这是默认的依赖范围。
compile作用域的依赖项在所有情况下都有效,包括编译、运行和测试。
provided:这个依赖范围表示该依赖项由 JDK 或运行容器在运行时提供。也就是说,该依赖项在测试和编译阶段需要,但在运行时由容器提供。
runtime:这个依赖范围表示该依赖项在运行时需要,但在编译阶段不需要。在测试阶段,该依赖项也会被使用。
test:这个依赖范围表示该依赖项只在测试阶段有用,在编译和运行阶段不会被使用。
system:这个依赖范围表示该依赖项是由我们提供的,不需要从 Maven 仓库中获取。使用该范围时,需要与 <systemPath>
标签配合使用,指定该依赖项在系统中的位置。
import:这个依赖范围用于在子项目中引入父项目的 <dependencyManagement>
中定义的依赖项。它允许子项目继承父项目的依赖项,而不需要直接继承父项目。