跳到主要内容

依赖管理

依赖配置与依赖传递

依赖指的是当前项目运行所需要的jar,一个项目可以有很多个依赖。 例如:

##container##
Clip_2024-04-02_09-23-03.png ##w600##

依赖传递

依赖具有传递性:

  • 直接依赖:在当前项目中,通过依赖配置建立的依赖关系。
  • 间接依赖:被依赖的资源,如果还依赖其他资源,那么当前项目间接依赖其他资源。

解决依赖冲突的问题

依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。

如下所示:

##container##
Clip_2024-04-02_09-27-02.png ##w600##

通过查看依赖,我们发现spring-aopspring-context都依赖了一个叫spring-core的依赖。此时spring-core的版本有两个。这样就产生了依赖冲突

解决依赖冲突:

1. 对于直接依赖, 使用最后声明的

例如以下的, 对于相同的直接依赖org.springframework我们使用最后声明的V1.1.4

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>1.1.4.RELEASE</version>
</dependency>
xml

2. 对于直接依赖和间接依赖, 使用直接依赖

例如以下, 有如下依赖关系loli -> imouto(imouto是loli的间接依赖)

那么使用的HX-loli是2.2, 其子依赖HX-imouto也是2.2, 但是因为下面直接定义了HX-imouto为3.3, 所以 使用直接依赖: 最终: HX-loli是2.2, HX-imouto为3.3

<dependency>
<groupId>org.HX</groupId>
<artifactId>HX-loli</artifactId>
<version>2.2.RELEASE</version>
</dependency>

<dependency>
<groupId>org.HX</groupId>
<artifactId>HX-imouto</artifactId>
<version>3.3.RELEASE</version>
</dependency>
xml

3. 对于间接依赖, 使用最先声明的

例如以下, 有如下依赖关系kawaii -> loli -> imouto(imouto是loli的间接依赖, 而 loli是kawaii的间接依赖)

因为HX-kawaii先声明, 而imouto都是kawaiiloli的间接依赖(子依赖), 所以HX-imouto使用先声明的HX-kawaii作为版本, 即: 最终: HX-kawaii是2.2, HX-loli是3.3, HX-imouto为2.2

<dependency>
<groupId>org.HX</groupId>
<artifactId>HX-kawaii</artifactId>
<version>2.2.RELEASE</version>
</dependency>

<dependency>
<groupId>org.HX</groupId>
<artifactId>HX-loli</artifactId>
<version>3.3.RELEASE</version>
</dependency>
xml

4. 排除依赖

在不影响项目运行的情况下,如果依赖冲突,可以把被冲突的依赖排除掉,注意排除的依赖不需要添加依赖的版本号。

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
xml

5. 版本锁定

使用dependencyManagement进行版本锁定,dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。

如果我们项目中只想使用spring core 5.2.0的包,pom.xml可以改为如下

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
xml

你甚至可以只在<dependencyManagement>声明需要的版本号, 这样在<dependencies>中就可以不写版本了, 注意<dependencyManagement>中声明只是声明, 并不会导入依赖!

依赖范围

什么是依赖范围

依赖的jar包在默认情况下可以在任何范围内使用,可以通过scope标签来控制其作用范围。

作用范围:

  • 主程序范围有效(main文件夹)
  • 测试程序范围有效(test文件夹)
  • 是否参与打包(package指令范围之内)
##container##
Clip_2024-04-02_10-28-28.png ##w600##

建议学习: 彻底搞懂Maven的依赖范围(scope)

请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...