美文网首页
maven实用妙招-如何解决依赖冲突

maven实用妙招-如何解决依赖冲突

作者: 野生Java程序员 | 来源:发表于2020-06-15 11:08 被阅读0次

依赖冲突

讲解依赖冲突之前,先给大家讲一讲依赖传递

依赖传递

先添加 springmvc 的核心依赖的坐标

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

会发现出现除了 spring-webmvc 以外的其他 jar。因为我们的项目依赖 spring-webmvc.jar,而
spring-webmvc.jar 会依赖 spring-beans.jar 等等,所以 spring-beans.jar 这些 jar 包也出现在了我
们的 maven 工程中,这种现象我们称为依赖传递。从下图中可看到他们的关系:(请注意
spring-beans 的版本)

依赖冲突的产生

接着添加一个依赖

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

我们会发现这两个 jar 包同时都依赖了 spring-beans



但是
spring-webmvc 依赖 spirng-beans-4.2.4,spring-context 依赖 spring-beans-5.0.2,但是发现
spirng-beans-4.2.4 加入到工程中



而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。解决依赖冲突有以下原则:

依赖冲突的解决

依赖调解原则

maven 自动按照下边的原则调解:

  1. 第一声明者优先原则

在 pom 文件定义依赖,先声明的依赖为准。
测试:
如果将上边 spring-webmvc 和 spring-context 顺序颠倒,系统将导入 spring-beans-5.0.2。
分析:
由于 spring-webmvc 在前边以 spring-webmvc 依赖的 spring-beans-5.0.2 为准,所以最终
spring-beans-5.0.2 添加到了工程中。

  1. 路径近者优先原则

例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那
如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传
递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路
径要近。
在本工程中的 pom 中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入
spirng-beans-5.0.2:


排除依赖

上边的问题也可以通过排除依赖方法辅助依赖调解,如下:
比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans,
下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。


锁定版本

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版
本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定
的版本的为准添加到工程中,此方法在企业开发中常用。
如下的配置是锁定了 spring-beans 和 spring-context 的版本:



还可以把版本号提取出来,使用<properties>标签设置成变量。



注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本
的依赖则需要单独添加<dependencies></dependencies>标签,如下:

上边添加的依赖并没有指定版本,原因是已在<dependencyManagement>中锁定了版本,
所以在<dependency>下不需要再指定版本。

相关文章

  • maven实用妙招-如何解决依赖冲突

    依赖冲突 讲解依赖冲突之前,先给大家讲一讲依赖传递 依赖传递 先添加 springmvc 的核心依赖的坐标 会发现...

  • POM文件

    解决依赖冲突 引用变量的三种情况(maven命令) 多环境属性过滤 各种依赖(POM文件详解) 解决maven传递...

  • Maven依赖冲突解决

    背景 在部署一个spring-boot项目到远程测试机上的tomcat之后,发现tomcat并没有启动起来,让我折...

  • maven依赖冲突解决

    一、maven自己调节原则1.第一申明优先原则.谁先依赖就导入谁的jar包2.路径近者优先原则直接依赖比传递依赖大...

  • Maven解决依赖冲突

    maven依赖冲突以及解决方法 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类...

  • 解决maven依赖冲突

    https://www.cnblogs.com/liqipeng/p/6770277.html

  • 如何解决maven依赖冲突?

    一.冲突问题 比如项目中引用了两个 fastjson.jar的版本,分别为 fastjson:1.2.28fast...

  • 如何解决maven冲突?

    如何解决maven冲突 maven冲突分两类:显示冲突和隐式冲突。 显示冲突:maven文件中直接以

  • Idea中常用的插件

    Maven Helper解决的是Maven依赖的冲突问题 FindBugs初步排查代码中的Bug ECTransa...

  • 依赖冲突解决办法

    依赖冲突解决办法 maven 的价值 Java开发中,jar的管理由maven来管。maven做的事情: jar统...

网友评论

      本文标题:maven实用妙招-如何解决依赖冲突

      本文链接:https://www.haomeiwen.com/subject/kircxktx.html