【Maven】006-Maven 依赖传递和依赖冲突
一、依赖传递
1、概述
-
概念:
- Maven 依赖传递是指当一个项目依赖于另一个项目或库时,Maven 会自动解析和获取这些依赖,确保项目能够顺利构建和运行。
- 依赖传递包括直接依赖和间接依赖。直接依赖是项目直接引用的库,而间接依赖是直接依赖所引用的其他库。
-
作用:
- 简化项目管理:Maven 通过依赖传递简化了项目的管理,开发者只需声明直接依赖,Maven 会负责解析和获取所有的间接依赖。
- 版本控制:Maven 可以管理不同库的版本冲突,确保项目使用的是正确的版本,避免冲突和不一致性。
-
传递的原则:
- 传递性: Maven 会自动传递依赖,确保直接依赖所需的库的所有间接依赖也能够被正确解析和获取。
- 最短路径优先: Maven 会选择最短路径来解析依赖,以确保使用最直接、最适合的版本。
- 冲突解决: 当出现版本冲突时,Maven 会根据一定的规则进行解决,通常选择最高版本的库。
-
依赖传递终止:
- 依赖传递会一直进行,直到达到最底层的库,这个库没有其他依赖为止。终止依赖传递的库被称为叶子节点。
- 通常,Java 标准库是依赖传递的终止点,因为它们不再依赖其他库。
2、案例:jackson 依赖
引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zibo</groupId>
<artifactId>mvn-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version>
</dependency>
</dependencies>
</project>
Maven 仓库详情页
IDEA 中查看 Maven 依赖关系
二、依赖冲突
1、概述
出现原因:直接或间接引入了相同的 jar 包!
冲突解决:自动能够解决,可手动解决,但不推荐手动解决!
当直接引用或者间接引用出现了相同的 jar 包! 这时呢,一个项目就会出现相同的重复 jar 包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!
Maven 自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!
2、冲突解决的两种方式
解决依赖冲突(如何选择重复依赖)方式:
-
自动选择原则
-
短路优先原则(第一原则)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则 A 依赖于 X(version 0.0.2)。
-
依赖路径长度相同情况下,则“先声明优先”(第二原则)
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在<depencies></depencies>中,先声明的,路径相同,会优先选择!文章来源:https://www.toymoban.com/news/detail-787812.html
-
-
手动排除文章来源地址https://www.toymoban.com/news/detail-787812.html
<dependency> <groupId>com.atguigu.maven</groupId> <artifactId>pro01-maven-java</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> <!-- 使用excludes标签配置依赖的排除 --> <exclusions> <!-- 在exclude标签中配置一个具体的排除 --> <exclusion> <!-- 指定要排除的依赖的坐标(不需要写version) --> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
到了这里,关于【Maven】006-Maven 依赖传递和依赖冲突的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!