什么是Maven依赖冲突,如何解决Maven依赖冲突

在解决冲突之前首先我们要知道什么是依赖冲突,这样可以更好的去锁定bug原因。下面通过一个代码示例来真正展示出依赖冲突。

目录

    • 依赖冲突代码演示
      • 1、添加依赖
      • 2、观察依赖的层次结构
      • 3、运行项目jra包冲突直接报错
    • 解决Maven依赖冲突的思路
      • 1、版本号统一
      • 2、路径最短者优先
      • 3、路径相同时先声明者优先
      • 4、排除依赖
    • 总结

依赖冲突代码演示

1、添加依赖

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

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
</dependency>

2、观察依赖的层次结构

这里以core包来示例,spring和spring mvc都会依赖core包,这里我们会发现虽然我只导入了spring和spring mvc,但是maven却帮我们导入了,他所需要的相关jar包,这就是依赖的传递性。

什么是Maven依赖冲突,如何解决Maven依赖冲突_第1张图片

3、运行项目jra包冲突直接报错

大概错误应该是找不到方法什么的,因为springmvc用的版本是5.0.2,而spring用的是4.2.4,依赖的传递他有一个就近原则,就是我spring依赖在上面所以他传递下来的就都是以spring的依赖版本为主的,也就是springmvc当中的core包相关包都会是4.2.4版本。版本之间肯定会有差异,所以有时候会报一些找不到方法或者类之类的错误。

什么是Maven依赖冲突,如何解决Maven依赖冲突_第2张图片

解决Maven依赖冲突的思路

下面简单讲一下当我们出现依赖冲突的时候,我们解决依赖冲突的思路。针对于上面的报错,经测试只能采用第一种方式可行。

1、版本号统一

当我们能版本号统一的时候尽量版本号统一,这样可以直接的避免一些版本之间差异的问题。这里我们让spring和spring mvc统一版本,两个都用5.0.2版本的,再次运行成功解决报错。

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

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
<dependencies>

2、路径最短者优先

这里我们还是以context包下的core包来做示例

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

 <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>5.0.2.RELEASE</version>
 </dependency>

从这里可以看出5.0.2取代了4.2.4,这就是我们所说的路劲最短者优先,因为context的依赖虽然会自动导入core包,但是那就是属于下级依赖了,而5.0.2这个依赖和context这个依赖为同级,所以最终会取这个版本。

什么是Maven依赖冲突,如何解决Maven依赖冲突_第3张图片

3、路径相同时先声明者优先

当我们把两个依赖顺序颠倒一下,会发现core包相关包都会是5.0.2版本,当然针对于上面问题,使用该方法仍然报错,因为有的时候版本之间是无法互相替代的,这个时候只能采用第一种版本号统一。

<dependencies>
	 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
     </dependency>
	 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.4.RELEASE</version>
    </dependency>
</dependency>

当调换顺序之后我们会发现他会都引用5.0.2

什么是Maven依赖冲突,如何解决Maven依赖冲突_第4张图片

4、排除依赖

jar包他是存在相互依赖的,就比如spring-context他依赖aop,和core包等,当他和别的jar包产生冲突的时候,我们可以考虑在保证项目在排除他的冲突jar包还可以正常运行和使用的情况下进行排除,从而解决依赖冲突的问题。
下面以core包为例,进行排除,首先打开pom然后打开依赖层次结构找到要排除的jar包以及层次,然后右键打开pom

什么是Maven依赖冲突,如何解决Maven依赖冲突_第5张图片

打开pom之后我们可以找到他的坐标和模块名称

什么是Maven依赖冲突,如何解决Maven依赖冲突_第6张图片
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.2.RELEASE</version>
	<exclusions>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
		</exclusion>
	</exclusions>
</dependency>

总结

总体来说解决冲突的方案就是以上几种,我们需要根据实际场景来进行选择性解决,看看哪一种方案更适合。

你可能感兴趣的:(Maven,maven)