如何解决Maven依赖冲突问题?

Maven依赖冲突问题的解决方法主要有:

  1. 先声明依赖原则:依赖链中先声明的依赖具有较高优先级,会被优先选择。
  2. 排除依赖:使用标签排除不需要的依赖。然后单独声明需要的依赖版本。
  3. 锁定版本:使用标签锁定依赖版本,子项目继承后也使用锁定版本。
  4. 使用版本范围:使用版本范围来限定依赖版本,如[1.0,2.0)。
  5. 重写依赖:子项目直接指定与父项目不同的依赖版本,重写父项目的声明。
  6. 使用生命周期映射锁定版本:在/中使用/锁定依赖版本。

例如:
场景1:存在依赖A->B->C,同时直接依赖C,导致的B与C版本冲突。

<dependencies>
    <dependency>
      <groupId>A</groupId> 
      <artifactId>A</artifactId> 
      <version>1.0</version> 
    </dependency>
    <dependency>
      <groupId>C</groupId>  
      <artifactId>C</artifactId>  
      <version>2.0</version> 
    </dependency>
</dependencies> 

解决:排除A对B的依赖,Then单独声明需要的B版本。

<dependencies>
    <dependency>
      <groupId>A</groupId> 
      <artifactId>A</artifactId> 
      <version>1.0</version>
      <exclusions>
        <exclusion>
          <groupId>B</groupId>  
          <artifactId>B</artifactId>  
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>B</groupId>  
      <artifactId>B</artifactId>  
      <version>1.5</version> 
    </dependency> 
    <dependency>
      <groupId>C</groupId>  
      <artifactId>C</artifactId>  
      <version>2.0</version> 
    </dependency>
</dependencies>

场景2:父项目与子项目依赖同一个jar但版本不同,导致的版本冲突。
解决:子项目指定自己需要的版本,重写父项目的依赖声明。

<!-- 父项目 -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>C</groupId>  
      <artifactId>C</artifactId>  
      <version>1.0</version> 
    </dependency>
  </dependencies>
</dependencyManagement>

<!-- 子项目重写版本 -->  
<dependencies>
  <dependency>
    <groupId>C</groupId>  
    <artifactId>C</artifactId>  
    <version>2.0</version> 
  </dependency>
</dependencies>

熟练掌握依赖冲突的各种解决方案,可以让我们在日常开发中更好的进行依赖管理,减少不必要的麻烦。