maven 依赖冲突问题

问题描述

今调试一个程序,引入了两个不同版本的jar包,发生了冲突,但是看到的现象是一个jar包都没引入进来。什么情况下发生冲突会一个jar包都引入不进来呢?

解决方案

maven引入依赖的时候,有的时候会发生循环依赖的情况,造成依赖失败,例如A依赖于B,B又依赖于C,C又依赖于A,造成一种环路,这样的话会失败。像楼上的那种排除依赖,正常情况下是可以正常依赖成功的。假设依赖A依赖于B,D也依赖于B,B在pom中有2个版本B1,B2(有可能是直接依赖,也有可能是间接依赖),那么maven会通过以下机制引入依赖:如果A直接依赖于B1,A-B1,D间接依赖于B2,例如D-C-B2,那么maven会有优先选择依赖路径短的那个版本,即依赖B1,而不依赖B2。假设B1,B2都是间接依赖,例如A-C-B1,D-C-B2,那么在选择B的依赖版本的时候,谁在pom文件中优先声明依赖了,那么就依赖哪个,假设A-C-B1在pom文件中优先D-C-B2声明了,那么将引入B1.
解决方案二:
是不是你库上没有这个包或者groupid, artifactid版本指定错误?
解决方案三:
不会出现你说的这种情况,如果引入两个版本,那么两个版本都会包含在项目的lib中.
解决方案四:
在有冲突的依赖下面加上exclusion,如不想用slf4j-log4j12默认的slf4j-api版本,而自己指定一个,可以这样:[xhtml] view plaincopy<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j-log4j12.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> 有时候不一定能发现是哪几个依赖冲突了,这时可以上http://mavenrepository.com查一下,比如发现lib里有javassist-3.4.GA.jar和javassist-3.7.ga.jar,而自己想用的是javassist-3.7.ga.jar,可以在上面的网站里查javassist-3.4.GA,在This artifact is used by ... 里会列出依赖于它的一些dependency,如org.hibernatehibernate-core3.3.1.GAorg.hibernatehibernate-entitymanager3.3.2.GA 等,再在那些dependency里加入exclusion去掉javassist就可以了,如下:[xhtml] view plaincopy<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> <exclusions> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>

时间: 2025-01-25 03:22:47

maven 依赖冲突问题的相关文章

Maven&amp;#183;依赖范围&amp;#183;传递依赖&amp;#183;依赖冲突

Maven因为执行一系列编译.测试和部署运行等操作,在不同的操作下使用的classpath不同,依赖范围就是用来控制依赖与三种 classpath(编译classpath.测试classpath.运行classpath)的关系. 依赖范围 scope 1.compile:默认范围,使用此依赖范围对于编译.测试.运行三种 classpath 都有效,即在编译.测试和运行的时候都要使用该依赖jar包 2.provided:在编译和测试时有效 3.runtime:在测试和运行时有效, 在编译主代码时无

maven 检查依赖冲突和版本冲突

在项目发布的时候,一般都需要进行依赖冲突检查或者重复类的检查,这个时候我一般会使用下面的两个命令:   1 2 3 mvn -U clean package -Dmaven.test.skip=true enforcer:enforce -DcheckDeployRelease_skip=true -Denforcer.skip=false   mvn -U dependency:tree -Dverbose   dependency: tree是检查版本冲突的 enforcer:enforce

maven3- maven项目依赖冲突,提示是jar重复了

问题描述 maven项目依赖冲突,提示是jar重复了 我的maven结构是这样的:parent(定义jar),parentWeb(最终发不到tomcat上),Cmodule(聊天模块),Dmodule(用户模块),parentWeb依赖于parent.Cmodule.Dmodule,Cmodule依赖于parent,Dmodule依赖于parent,现在我总是出现一下这个问题: Duplicate fragment name: spring_web for jar:file:/d:/Users/

安装软件时依赖冲突的万能解决方案

好吧,可能是个标题党了. 不过如果你这个方法还不能解决依赖冲突,那就我目前就不知道有什么办法了. 不过一般情况下,使用这个方法都可以修复问题的. 基础的解决方案 如果你是刚遇到依赖冲突问题,可以先参考这里基本的解决方案. 源的问题:下列的软件包有不能满足的依赖关系 各种解决方法:软件包没有被完全安装或卸载问题 进入正题 先说说背景吧. 使用基础解决方案不能解决的,更严重的是,想重装那些软件,却卸载不了,提示依赖冲突. 这个时候我都想重装系统了,可是我配置了这个多东西,安装了这个多软件等原因,不到

Maven依赖的配置

Maven的依赖配置有基本的groupId,artifactId和version等元素组成,其实一个依赖声明可以包含如下的  一些元素      <project>          ...          <dependencies>              <dependency>                  <groupId>...</groupId>                  <artifactId>...&

关于maven依赖apklib问题

问题描述 关于maven依赖apklib问题 我有Android项目需要使用到第三方的组件,比如github上的PullToRefresh,我把代码clone到本地,用Maven安装到本地资源库,可是当我引用该组件的.apklib的时候,项目报错,提示未找到相应的类文件,引用如下: <dependency> <groupId>com.github.chrisbanes.pulltorefresh</groupId> <artifactId>library&l

关于maven依赖引入多少个jar包问题?

问题描述 关于maven依赖引入多少个jar包问题? 10C 我有这样的疑问我项目中依赖了spring-context的时候项目中能自动导入: 但是当我依赖的是就只能引入一个jar包:我能不能在maven的中央仓库中查询到某个依赖会引用多少个jar包进来?还有就是我怎么实现只要在pom文件引用一个dependency就能把hibernate的所以相关jar引进来? 解决方案 你得groupid artifactid等这些都会确定唯一的jar ,不会引入多个jar的. maven仓库 hibern

maven依赖关系中Scope的作用

原文:http://peak.iteye.com/blog/299225 maven依赖关系中Scope的作用 Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值:     * compile,缺省值,适用于所有阶段,会随着项目一起发布.     * provided,类似compile,期望JDK.容器或使用者会提供这个依赖.如servlet.jar.     *

深入实践Spring Boot1.3.1 Maven依赖管理

1.3.1 Maven依赖管理 使用Maven,通过导入Spring Boot的starter模块,可以将许多程序依赖包自动导入工程中.使用Maven的parent POM,还可以更容易地管理依赖的版本和使用默认的配置,工程中的模块也可以很方便地继承它.例如,使用1.2.1节创建的工程,修改pom.xml文件,使用如代码清单1-1所示的简单Maven配置,基本上就能为一个使用Spring Boot开发框架的Web项目开发提供所需的相关依赖. 代码清单1-1 Spring Boot Web基本依赖