如何解决maven中依赖的版本冲突问题?

222 阅读1分钟

前言

什么是依赖冲突

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

maven依赖原则

maven依赖主要有两大原则

1、路径最近者优先

相同jar不同版本,根据依赖的路径长短来决定引入哪个依赖。

举例

依赖链路一:A -> B -> C -> X(1.0)
依赖链路二:F -> D -> X(2.0)

该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。依赖调解第一原则不能解决所有问题,比如这样的依赖关系:

A -> B -> Y(1.0)
c -> D -> Y(2.0)

Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。Maven定义了依赖调解的第二原则:

2、第一声明者优先

在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用,顺序最前的那个依赖优胜。该例中,如果A的依赖声明在C之前,那么Y (1.0)就会被解析使用.

注意 子pom内声明的优先于父pom中的依赖。

解决方案

1.排除依赖

关键字:exclusions

exclusions可以包含一个或者多exclusion子元素,因此可以排除一个或者多个传递性依赖。

需要注意的是,声明exclusion的时候只需要groupld和artifactld,而不需要要version元素。

示例

   <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.10.1</version>
            <!--排除poi依赖-->
        <exclusions>
            <exclusion>
                <artifactId>poi</artifactId>
                <groupId>org.apache.poi</groupId>
             </exclusion>
        </exclusions>
   </dependency>

2.版本锁定原则(常用)

在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。

<properties>
        
  <spring.version>4.2.4.RELEASE</spring.version>
  <hibernate.version>5.0.7.Final</hibernate.version>
  <struts.version>2.3.24</struts.version>
    
</properties>
   
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
    
<dependencyManagement>    
  <dependencies>
    <dependency>    
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>      
      <version>${spring.version}</version>
    </dependency>
</dependencies>
</dependencyManagement>