如何快速的解决Maven依赖冲突

为什么会出现依赖冲突


首先要说明Maven的依赖管理,具体的可以参考这边 Maven学习——依赖管理 这篇文章,maven在依赖冲管理中有一下几个原则。

  1. 依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId,
    version)构成。如果两个相同的依赖包,如果groupId, artifactId, version不同,那么maven也认为这两个是不同的。

  2. 依赖会传递,A依赖了B,B依赖了C,那么A的依赖中就会出现B和C。

  3. Maven对同一个groupId, artifactId的冲突仲裁,不是以version越大越保留,而是依赖路径越短越优先,然后进行保留。

  4. 依赖的scope会影响依赖的影响范围。

当出现了依赖的时候如何快速定位冲突原因

但出现了冲突的时候,比如系统出现了NoSuchMethodError,LinkageError
很有可能是你系统中出现了依赖冲突。出现冲突以后,可以按以下的步骤执行

1.确定出了问题的jar包名称。通常可以在eclipse中查找冲突的类有在哪些依赖包里面出现了。并确定实际要使用的是那个包,冲突的包有哪些。

2.通过mvn dependency:tree  >  tree.txt 导出全部的依赖。

3.在导出的依赖文件中,查找问题相关的jar。确定这些jar是如何被依赖进来的,是直接依赖的还是通过传递依赖引入的。

4. 找到相互冲突的并需要排除的依赖的顶级依赖,并分析冲突的原因,冲突的原因可能是以下几种:

  • 同一个jar包但groupId, artifactId不同,这种冲突只能通过设定依赖的<exclusions> 来进行排除

  • 需要的版本jar包依赖路径较长,这种冲突可以把想要版本的依赖直接什么在依赖中,这样路径就最短了优先级最高。

5.最后可以通过打包mvn install 来确认打出来的war包中是否有被排除的依赖。

------------------------------------------------------------------------------------------------------------------------

来源:http://www.daniel-journey.com/archives/1125

如何快速的解决Maven依赖冲突,布布扣,bubuko.com

时间: 2024-10-09 22:47:42

如何快速的解决Maven依赖冲突的相关文章

IDEA 解决 Maven 依赖冲突的高能神器,这一篇够不够?

? 1.何为依赖冲突 Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的.Maven的依赖机制会导致Jar包的冲突.举个例子,现在你的项目中,使用了两个Jar包,分别是A和B.现在A需要依赖另一个Jar包C,B也需要依赖C.但是A依赖的C的版本是1.0,B依赖的C的版本是2.0.这时候,Maven会将这1.0的C和2.0的C都下载到你的项目中,这样你的项目中就存在了不同版本的C,这时Maven会依据依赖路径最短优先原则,来决定使用哪个版本的Jar包,而另一个无用的Jar包则未被使用,

解决maven依赖冲突

今天新建了一个项目,初始化了一下,发现跑不起来. 报错信息 java.lang.ClassNotFoundException: org.mybatis.logging.LoggerFactory pom文件中有mybatis-plus-boot-starter 按道理来说是不应该出现这种情况的 上网搜了一下,发现各种各样的说法都有,没啥头绪. 冷静下来思考一下,虽然百度上各种各样的说法都有,但是归总一下,其实都是在说pom文件的依赖有问题. 所以我们应当看下pom文件中有没有依赖冲突. 下好ma

使用maven-shade-plugin插件解决spark依赖冲突问题

依赖冲突:NoSuchMethodError,ClassNotFoundException   当用户应用于Spark本身依赖同一个库时可能会发生依赖冲突,导致程序奔溃.依赖冲突表现为在运行中出现NoSuchMethodError或者ClassNotFoundException的异常或者其他与类加载相关的JVM异常. 此时,若能确定classpath中存在这个包,则错误是因为classpath中存在2个不同版本的jar包了,比如常见的log4j,你在classpath中添加了log4j.jar,

idea 中解决maven 包冲突的问题(maven helper)

日常开发中经常会遇到xxx.class 找不到的异常,但是这个类确实存在我们的项目中,就会感觉很离奇,其实这就是包冲突的问题 冲突问题 比如项目中引用了两个 fastjson.jar的版本,分别为 fastjson:1.2.28 fastjson:1.2.3 我们用到了1.2.28中的某个类, 比如 A类,在版本更新中 1.2.3版本去掉了这个类,然而我们项目中maven 却把1.2.3的 jar 打包进去了,那我们就会报异常,不存在这个 class,但是我们调错误的时候却发现这个类存在,那我们

解决Maven依赖本地仓库eclipse报错的问题

一.应用场景 有时候项目报红色的感叹号错误也是由于项目中没有导入相关jar报导致报错 为了使用maven强大的包依赖管理和项目管理功能,故在项目中使用maven2作为项目建构工具. 但是我的项目在内网构建,为了能使用maven2,只能使用本地仓库依赖策略. 但是,有时候明明本地仓库确确实实存在相应的依赖包,但是在eclipse环境下依然会报错,即:在pom.xml显示错误提示信息. 经过我的实践证明,可以通过如下方式解决. 二.示例讲解 以依赖commons-io-2.0.1为例讲解: 在pom

解决Maven依赖下载不全的问题

背景描述 在日常学习过程中使用Maven构建SpringBoot+SpringCloud服务时,有时会使用非正式版的SpringBoot和SpringCloud(非正式版是指不是最终发布的版本,而是测试版或里程碑版本,例如:2.0.0.BUILD-SNAPSHOT.Finchley.BUILD-SNAPSHOT.2.0.0.M3.Finchley.M2这些都属于非正式版,而像1.5.16.RELEASE这样的RELEASE版本即为正式版),一般在工作中构建微服务都会使用正式版本进行构建,因为正式

Struts2与Spring的Maven依赖冲突

今天在用Maven集成Struts2+Spring+Hibernate时发现只要不在web模块中声明spring-web的依赖,就会报java.lang.NoClassDefFoundError: [Lorg/springframework/context/ApplicationContextInitializer;异常,站点无法启动. 对比了半天发现添加spring-web依赖后打包生成的文件少了一个spring-asm-3.0.5.RELEASE.jar文件,很是纳闷,再仔细看spring-

maven 依赖冲突的问题

如果原始系统的jarA依赖jarB1.0 而新引入的jarC依赖jarB2.0 导致系统启动报错,提示冲突,这时为了保证原始系统的稳定性, 在pom.xml文件中引入jarC时,需要exclude掉jarB2.0 如果原始系统依赖jarA1.0 这时为了使用新的功能需要使用jarA2.0,如果子系统B中使用了jarC1.0依赖A1.0,如果在子系统B中直接使用依赖jarA2.0,肯定会 报冲突,这时需要在pom.xml修改jarC1.0的引入代码,添加exclude掉jarA1.0,然后可以添加

Maven依赖冲突

1.短路优先 A-->B-->C-->X(jar) A-->D-->X(jar) 2.先声明先优先 如果路径长度相同,则谁先声明,先解析谁. pom.xml A B ==>导致最终依赖的c的版本是2.2 A.pom.xml C(2.2) B.pom.xml c(2.5)