Maven重复依赖问题解决(同一个jar多个版本)

 更新时间:2023年06月15日 15:03:53   作者:奔跑吧人生  
本文主要介绍了Maven重复依赖问题解决(同一个jar多个版本),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

现在开发项目,一般都会创建maven工程,用它来管理依赖实在是方便了,当然它还有其它用途。但是在实际的情况中往往会有重复依赖的问题,比如创建的工程A,依赖了b-1.0.jar,而b-1.0.jar又依赖了d-1.0.jar(这个我们本身是不能直接看到的),同时我们自己的工程又依赖了d-2.1.jar,或者工程A依赖了c-1.0.jar,c-1.0.jar依赖了d-2.0.jar,显然,d.jar有3个版本,3者之间是重复的,甚至是冲突的。如下图所示:

重复依赖会怎么样?

首先从工程角度来讲,引用了同一个Jar的不同版本,这肯定是依赖有问题,或者就是错误的。
其次,重复依赖,在项目启动过程当中可能会有一些警告信息。
当然,最重要的是引发代码异常,最常见的就是NoSuchMethod。

解决思路

  • 寻找重复引用的jar。
  • 定位这些Jar在哪里被引用了。
  • 接下来需要分析舍与留,原则上保留高版本,大多数情况下是向下兼容的。但是不一定,有时候也得保留低版本,或者有时候两者都需要保留。
  • 如果是一个工程,其实处理起来还比较好处理。但是如果有多个工程,最终我们可能将所有的依赖合在一块儿。处理起来可能会稍微麻烦些,比如工程1依赖了2.1版本,工程2依赖了2.2版本,你把工程1的2.1的依赖去掉,但同时还需要把2.2的加在工程1上面,否则可能编译不通过。
  • 最重要的就是,调整之后,尽可能做全面测试。特别是一些间接依赖,如果去除的话,编译不会有问题,但运行起来会有问题。

具体解决过程

上述5个步骤,重点说一下1和2.

寻找重复引用的jar

  • 观察法:把所有的jar依赖打包到同一个目录下,观察。
  • 运行法:运行阶段会报错,一旦报错,基本上就定位到了。
  • 扫描法:专业的测试人员,可以进行扫描jar包并统计。
  • 搜索法:依靠maven进行搜索,这个方法在接下来会讲到。

定位Jar被依赖的地方

在maven工程处打开命令行,输入:

mvn dependency:tree -Dverbose > tree.txt

这个命令会把这个工程pom.xml里面所有的依赖通过树的形状展示出来,tree.txt:

树形结构其实看得比较清楚,里面有一些关键信息,比如:

omitted for duplicate

这个意思是依赖是重复的,当然这个没有关系。

当然还有一些冲突提醒,上图没有,如下:

omitted for conflict with 0.5.3

显示就是这个版本与0.5.3这个版本冲突了,这个也是我上面说到的搜索法,你可以直接搜索“conflict”这个单词,就可以了。当然这种方式仅限单个工程。

拿到这棵树以后,怎么办呢?

前提是我们已经知道了哪个jar包冲突了,那直接就在文本里面搜索,找到不同版本的引用之处,然后慎重考虑之后,通过exclusions标签进行去除,如下:

<dependency>
			<groupId>jaxen</groupId>
			<artifactId>jaxen</artifactId>
			<version>1.1.1</version>
			<exclusions>
				<exclusion>
					<groupId>xerces</groupId>
					<artifactId>xercesImpl</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

去除的同时需要考虑的一些问题,在解决思路里面提及了一些。到此这篇关于Maven重复依赖问题解决(同一个jar多个版本)的文章就介绍到这了,更多相关Maven重复依赖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于shiro中部分SpringCache失效问题的解决方法

    关于shiro中部分SpringCache失效问题的解决方法

    这篇文章主要给大家介绍了关于shiro中部分SpringCache失效问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • SpringAop实现原理及代理模式详解

    SpringAop实现原理及代理模式详解

    Spring的AOP就是通过动态代理实现的,使用了两个动态代理,分别是JDK的动态代理和CGLIB动态代理,本文重点给大家介绍下SpringAop实现原理及代理模式,感兴趣的朋友一起看看吧
    2022-04-04
  • Spring Security自定义认证逻辑实例详解

    Spring Security自定义认证逻辑实例详解

    这篇文章主要给大家介绍了关于Spring Security自定义认证逻辑的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 若依前后端打成一个JAR包部署的完整步骤

    若依前后端打成一个JAR包部署的完整步骤

    这篇文章主要介绍了如何将若依前后端分离项目打包成jar,不使用nginx转发,前端修改了路由模式和环境变量配置,后端增加了依赖、配置了Thymeleaf和访问路径,需要的朋友可以参考下
    2025-01-01
  • java中如何实现 zip rar 7z 压缩包解压

    java中如何实现 zip rar 7z 压缩包解压

    这篇文章主要介绍了java中如何实现 zip rar 7z 压缩包解压问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • maven的5种打包方式小结

    maven的5种打包方式小结

    本文主要介绍了maven的5种打包方式小结,主要是几种插件打包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 解决Java中properties文件编码问题

    解决Java中properties文件编码问题

    大家好,本篇文章主要讲的是解决Java中properties文件编码问题,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Java通过python命令执行DataX任务的实例

    Java通过python命令执行DataX任务的实例

    今天小编就为大家分享一篇Java通过python命令执行DataX任务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 开源项目ERM模型转jpa实体maven插件使用

    开源项目ERM模型转jpa实体maven插件使用

    这篇文章主要为大家介绍了开源项目ERM模型转jpa实体maven插件的使用说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • mybatis-plus实现自定义SQL、多表查询与多表分页查询语句实例

    mybatis-plus实现自定义SQL、多表查询与多表分页查询语句实例

    mybatisplus是个很好用的插件,相信小伙伴们都知道,下面这篇文章主要给大家介绍了关于mybatis-plus实现自定义SQL、多表查询与多表分页查询语句的相关资料,需要的朋友可以参考下
    2022-09-09

最新评论