Maven依赖传递和依赖冲突

1. Maven依赖传递特性

概念

假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A, 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性。

作用

  • 简化依赖导入过程
  • 确保依赖版本正确

传递的原则

在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围以及配置

  • B 依赖 C 时使用 compile 范围:可以传递

  • B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

  • B 依赖 C 时,若配置了以下标签,则不能传递

    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druidartifactId>
        <version>1.2.15version>
        <optional>trueoptional>
    dependency>
    

依赖传递终止

  • 非compile范围进行依赖传递
  • 使用optional配置终止传递
  • 依赖冲突(传递的依赖已经存在)

案例:导入jackson依赖

分析:jackson需要三个依赖

Maven依赖传递和依赖冲突_第1张图片

依赖传递关系:data-bind中,依赖其他两个依赖
Maven依赖传递和依赖冲突_第2张图片

最佳导入:直接可以导入data-bind,自动依赖传递需要的依赖


<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.10.0version>
dependency>

2. Maven依赖冲突特性

当直接引用或者间接引用出现了相同的jar包! 这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!
Maven依赖传递和依赖冲突_第3张图片

maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!

解决依赖冲突(如何选择重复依赖)方式:

  1. 自动选择原则

    • 短路优先原则(第一原则)

      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)

      中,先声明的,路径相同,会优先选择!

  2. 手动排除

    <dependency>
      <groupId>com.atguigu.mavengroupId>
      <artifactId>pro01-maven-javaartifactId>
      <version>1.0-SNAPSHOTversion>
      <scope>compilescope>
      
      <exclusions>
        
        <exclusion>
          
          <groupId>commons-logginggroupId>
          <artifactId>commons-loggingartifactId>
        exclusion>
      exclusions>
    dependency>
    
  3. 小案例

    伪代码如下:

    前提:
       A 1.1 -> B 1.1 -> C 1.1 
       F 2.2 -> B 2.2 
       
    pom声明:
       F 2.2
       A 1.1 
    

    请问最终会导入哪些依赖和对应版本?

你可能感兴趣的:(JAVA进阶之路,maven,java)