文章目录 一、Gradle 依赖优化 二、命令行查看依赖模块 1、使用最高版本依赖选择 2、排除重复依赖 3、排除重复依赖 + 最高版本依赖选择 三、依赖传递冲突解决方案 1、依赖传递冲突 2、分库冲突 这就导致了依赖冲突 ; 这是由于程序传递 , 导致的程序间依赖库不兼容 的 依赖冲突问题 ; 这是由于依赖版本不同导致的依赖冲突 ; 2、分库冲突 依赖库可能存在分库 , 如 : 依赖库 A 中 , 包含了 , 导致了冲突 ; 这是由于依赖版本不同导致的依赖冲突 ; 3、赖分组不同导致冲突 在之前开发中使用的是 support 依赖库 , 但是新版本的 Android 开发时使用 androidx 依赖库 , 这就导致了冲突 ; 这是由于依赖分组不同导致的依赖冲突 ; 4、解决思路 依赖冲突的本质是 一个类 出现了 两次 , 而且所处的依赖库的版本不同 , 或者 依赖分组不同 ; 通过排除依赖或者强制指定依赖 , 可解决依赖冲突 ;
依赖冲突产生的原因:就像A引入了B和C,但是在B和C中都依赖了D,B依赖的D的1.0版本,C依赖了D的1.1版本。 这是两个版本的D就有可能出现冲突,为什么是有可能? 因为依赖管理是根据两个版本的深度和谁先声明,来决定选谁。 依赖冲突大多场景:NoSuchMethod、NotFoundClass,方法类不一致。 解决方式:mvn denpendency:treee -->tree.tex 在当前目录打印出maven 依赖树生成tree.txt 文件,找出冲突的jar。 如何避免依赖冲突:项目中依赖的jar都有父POM < dependencyManagement>管理,其他模块使用import。
本文将从Maven依赖管理的底层原理出发,带你彻底搞懂依赖冲突的本质,掌握从本地到线上的全链路排查工具,提供从根源解决冲突的7大方案,配合可直接运行的实战案例,让你不仅能快速解决冲突,更能从源头避免冲突的发生 一、Maven依赖管理核心原理:搞懂底层才不会瞎操作 依赖冲突的本质是Maven依赖调解规则与JVM类加载机制的共同作用,不懂底层原理,解决冲突就是无源之水。 方案3:排除冲突的传递依赖(精准修复方案) 原理 在引入依赖时,通过<exclusions>标签排除该依赖传递进来的冲突Jar包,仅保留项目中已有的正确版本。 适用场景 某个依赖传递了冲突的版本,其他依赖传递的版本是正确的,仅需精准排除冲突版本。 真正的高手,从来不是能快速解决冲突,而是能通过规范的依赖管理,从根源上避免冲突的发生。希望本文能帮你彻底搞定Maven依赖冲突,告别“玄学排错”。
1、简介 1.1、什么是依赖冲突 依赖冲突是指:在 Maven 项目中,当多个依赖包,引入了同一份类库的不同版本时,可能会导致编译错误或运行时异常。 1.2、依赖冲突的原因 我们在 Maven 项目的 Pom 中 一般会引用许许多多的 Dependency。 传递性依赖会给项目引入很多依赖,简化项目依赖管理,但是也会带来问题。 最明显的就是容易发生依赖冲突。 点击 Dependency Analyzer 之后就会进入到下面的页面 从图中可以看出有哪些jar存在冲突,存在冲突的情况下最终采用了哪个依赖的版本。标红的就是冲突版本,白色的是当前的解析版本。 比如A升级到A(2.0),使它依赖的X版本变成X(2.0)这样的话就解决依赖冲突。
说maven依赖冲突之前需要先说说maven的 依赖传递。 依赖传递 当前项目引入了一个依赖,该依赖的依赖也会被引入项目。 依赖冲突和依赖调解 真是因为依赖传递,所以才带来了依赖冲突的可能。比如A->X(1.0),A->B->X(2.0)。A直接依赖了1.0版本的X,而A依赖的B依赖了2.0版本的X。 如果依赖范围合适的话,B中依赖的X也是会传递到A项目中的。而两个X的版本不一致,这就产生了依赖冲突。 在依赖冲突发生时,maven不会直接提示错误,而是用一套规则来进行 依赖调解。 大部分情况下maven这种自动的依赖调解能帮我们解决问题了。但是有时候我们不得不手动处理依赖冲突。这种冲突可能不是同一个依赖的不同版本(这个依赖调解能搞定),而是不能同时出现的两个依赖。 ,会比较麻烦,可以参考:maven实现依赖的“全局排除” 检查依赖冲突 因为maven在依赖冲突发生时使用依赖调解,所以不会有任何提示。
type model.LabelName has no field or method IsValid) 这个原因是由于 dep 在打包的时候用的是 Prometheus 的语义化版本 0.9.2,其依赖的
在idea中,如何查看maven中哪些依赖存在着版本冲突。 我们这边用mybatisplus举例,引入了不同版本的依赖。 mybatis-plus-generator</artifactId> <version>3.2.0</version> </dependency> 点击右侧边框中的maven按钮 找到并点击分析依赖关系 通过左侧“已解析的依赖项”,可以看出哪些以来存在问题(感叹号标识)。 点击出现问题的依赖项,可以查看详细。
【Maven】006-Maven 依赖传递和依赖冲突 一、依赖传递 1、概述 概念: Maven 依赖传递是指当一个项目依赖于另一个项目或库时,Maven 会自动解析和获取这些依赖,确保项目能够顺利构建和运行 最短路径优先: Maven 会选择最短路径来解析依赖,以确保使用最直接、最适合的版本。 冲突解决: 当出现版本冲突时,Maven 会根据一定的规则进行解决,通常选择最高版本的库。 二、依赖冲突 1、概述 出现原因:直接或间接引入了相同的 jar 包! 依赖冲突避免出现重复依赖,并且终止依赖传递! Maven 自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐! 2、冲突解决的两种方式 解决依赖冲突(如何选择重复依赖)方式: 自动选择原则 短路优先原则(第一原则) A—>B—>C—>D—>E—>X(version 0.0.1) A—>F—>X(version
Maven依赖冲突的解决方式 [在这里插入图片描述] 对Maven概念还不了解的可以看看我的这篇文章: https://blog.csdn.net/pjh88/article/details/108520721 在讲依赖冲突之前我们先来讲讲什么是依赖传递 在maven中依赖是可以传递的,比如我们有A,B,C三个项目,其中A依赖B,B依赖C,由递推可知A依赖C [在这里插入图片描述] 举例 比如我们在web项目中导入 sping-aop、spring-beans [在这里插入图片描述] 什么是依赖冲突 这是由于依赖传递现象的存在 比如spring-webmvc 依赖 spirng-beans-4.2.4,而spring-aop 这就造成了依赖冲突。 包还是要使用dependencies标签 [在这里插入图片描述] 在使用dependence标签的时候不需要再指定版本号了 [在这里插入图片描述] [在这里插入图片描述] 以上就是Maven依赖冲突的解决方式
Maven依赖冲突的解决方式 ? 对Maven概念还不了解的可以看看我的这篇文章: https://blog.csdn.net/pjh88/article/details/108520721 在讲依赖冲突之前我们先来讲讲什么是依赖传递 什么是依赖冲突 这是由于依赖传递现象的存在 比如spring-webmvc 依赖 spirng-beans-4.2.4,而spring-aop 依赖 spring-beans-5.0.2,但是发现 spirng-beans 这就造成了依赖冲突。 ? 在我们的开发中我们当然啦不允许这种情况的出现,我们要使用什么版本,他就必须使用什么版本 ? 以上就是Maven依赖冲突的解决方式,如有帮助还请点赞关注支持,如有疑问评论私信都可,看到后可帮助解答本博客主要侧重于数据结构于算法和java开发,操作系统,计算机网络,觉得我的文章有帮助的小伙伴可以关注我
在使用maven构建依赖的时候,发现springBoot的版本和导入的依赖版本中的 spring-context 的版本出现冲突。 image.png 要引入的依赖,它所依赖的spring-context版本为3.24 我的springboot 主版本较高2.18 它的spring-context为5.19 因此在被依赖的版本和 自己的springboot 版本都出现了冲突的提示 image.png 要知道sping-context 下包含了很多的依赖 如core aop beans 等 因此他们的都会有版本冲突。 解决办法 出现这种问题的办法首先是因为 依赖的上传者 没有约束自己的引入的依赖 比如 在它引入的时候要将 optional 去约束否则就会产生 版本依赖传递的问题。 解决方法 在引入它的依赖下面 排除掉冲突的依赖 <dependency> <groupId>com.xxx</groupId> <artifactId>xxx</artifactId
2.选择 1.点击Analyzer,会发现有些冲突。 ? 2.选中冲突的,会有冲突细节 ? 3.在冲突的依赖上右键,会提示排除,点击即可,会自动添加依赖排除 ? 4.查看依赖,绿色的部分就是插件自动添加的排除语句 ?
此插件可用来方便显示maven的依赖树,在没有此插件时,如果想看maven的依赖树需要输入命令行:mvn dependency:tree 才可查看依赖。 如果想看是否有依赖包冲突的话也需要输入命令行等等的操作。而如果安装Maven Helper插件就可免去命令行困扰。通过界面即可操作完成。 ? Conflicts(查看冲突) 2. All Dependencies as List(列表形式查看所有依赖) 3. All Dependencies as Tree(树形式查看所有依赖) 下图是项目文件pom.xml在Dependency Analyzer视图中的显示: ? 点个在看少个 bug
什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。 每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突 如何解决依赖冲突 首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了 具体执行步骤如下 1、查看依赖冲突 a、通过dependency:tree是命令来检查版本冲突 mvn -Dverbose dependency:tree 当敲入上述命令时,控制台会出现形如下内容 [INFO ) All Dependencies as List(列表形式查看所有依赖) All Dependencies as Tree(树形式查看所有依赖) 上图说明有3个jar存在冲突,点击冲突的jar,可以查看和哪个 ,对于排查依赖个人比较推荐使用maven helper插件,至于解决依赖冲突个人推荐使用版本锁定的方法,此外dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖
什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。 每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突 如何解决依赖冲突 首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了 具体执行步骤如下 1、查看依赖冲突 a、通过dependency:tree是命令来检查版本冲突 mvn -Dverbose dependency:tree 当敲入上述命令时,控制台会出现形如下内容 [ 上面按钮的图标含义如下 Conflicts(查看冲突) All Dependencies as List(列表形式查看所有依赖) All Dependencies as Tree(树形式查看所有依赖) 通过上图可以看到项目引入是 spring core 5.2.0的包 总结 综上就是maven如何排查依赖冲突以及解决方法,对于排查依赖个人比较推荐使用maven helper插件,至于解决依赖冲突个人推荐使用版本锁定的方法
前言 什么是依赖冲突? 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突。 一级依赖中,后声明的依赖会覆盖先声明的依赖,并且如果是前面的版本低后面的版本高会显示冲突,反之却不会显示冲突; 解决冲突的方式 根据优先原则,把需要的版本放在路径最短的位置或最先声明 排除其他版本的依赖 其中三个选项分别表示如下: Conflicts(查看所有冲突的依赖,所有的冲突依赖都会在下面显示,不冲突的不显示) All Dependencies as List(列表形式查看所有依赖,冲突的依赖会红字显示 ) All Dependencies as Tree(树形式查看所有依赖,冲突的依赖会红字显示) 注意 排查冲突的时候推荐使用第二种方式找到冲突项,搜索冲突项用第三种方式排除冲突。 升降依赖版本解决 查看上面的冲突检测进行升降版本 Jar隔离 当然不是所有情况都可以通过升降级jar解决冲突,举个例子: 如上图假设应用系统同时依赖A.jar,B.jar,而A.jar,B.jar都依赖
依赖共享与冲突 在 npm v3 版本之后,npm 采用了更合理的方式去解决之前的依赖地狱的问题。 npm v3 尝试把依赖以及依赖的依赖都尽量的平铺在项目根目录下的 node_modules 文件夹下以共享使用;如果遇到因为需要的版本要求不一致导致冲突,没办法放在平铺目录下的,回退到 npm v2 由于它和它的依赖在 node_modules 下都不会产生冲突,因此能够直接平铺的放入其中。 B 自身以及它的依赖 E 也没有冲突,直接平铺放入 node_modules 下;但是 B 的另一依赖 C@2.0.0 因为 C@1.0.0 已经存在了,出现了版本冲突,它将不得不被放置于 B 目录下的 类似的,它的依赖 C@2.0.0 因为版本冲突,不得不被放置于 F 的 node_modules 中。
1.错误提取 错误来源于:Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12,所以可以看出是因为依赖冲突,导致StackOverflowError 没办法所以只能先看一下整个依赖里面slf4j-log4j12是在哪里,查找了一遍果然找到相关的依赖,slf4j-log4j12如下图所示: ? 可是为什么没有这个依赖,会有jar加载到项目中去呢,分析一下基本可以断定,应该是其它依赖的子依赖有引用到org.slf4j这个依赖。 3.问题排查 那怎么看到底是哪一个依赖引用到了org.slf4j依赖呢,这边我们可以用idea的一个查看依赖的功能。 ? 打开之后如下所示: ? 4.修复bug 从这个图我们可以很明显的看出,是zookeeper依赖引用了slf4j-log4j12依赖,所以我们只要在zookeeper依赖中使用exclusion进行依赖接触可以了,具体pom代码如下所示
文章目录 一、dependencies 依赖查找路径 二、dependencies 依赖冲突问题 三、dependencies 依赖库层级分析 Android Plugin DSL Reference : 二、dependencies 依赖冲突问题 ---- 添加构建依赖项 参考文档 : https://developer.android.google.cn/studio/build/dependencies com.Android.support:appcompat-v7:23.0.0' } 执行 gradlew :app:assembleDebug 命令 , 进行编译打包时 ; 在编译打包时 , 就会出现依赖冲突问题 | 使用命令行查看模块 ) 中介绍了如果配置了两个相同的依赖 , 则选取较高版本的依赖库 , 因此原理上 , 不会出现依赖冲突问题 ; 三、dependencies 依赖库层级分析 ---- 分析依赖问题 , 就需要查看依赖情况 , 在 Terminal 面板中执行 gradlew :app:dependencies 命令 , 查看依赖的情况 , 逐个排查依赖冲突问题 ; 在输出日志中 , 可以查看顶层依赖库
四、通过 configuration 配置排除子依赖库 五、force 强制指定依赖库 一、查询 Android 依赖库的配置 ---- 在遇到 依赖冲突 时 , 如果要 排查某个依赖的子库 时 , 依赖库 为例进行演示 , 这个库经常会造成依赖冲突 ; Android 官方提供的依赖库 , 都放在 SDK 的 extras 目录 下 , 如下图所示 : 其中 Android Support * 属于此依赖项的工件本身可能依赖于其他工件。 * 后者称为传递依赖。 * * @param transitive 是否应解析可传递依赖项。 ---- 针对依赖库冲突 : 依赖库 A 中 , 包含了 B , C 分库 , 它们的 所有版本都是 1.0 版本 , 这两个分库是无法分开的 ; 应用突然 单独的依赖了 2.0 版本的 B 依赖库 , 这就 出现了冲突 , 此时就会 引入了两个版本的 B 依赖库 , 导致了冲突 ; 在依赖库中 , 可以将其中的某个依赖库剔除 , 如 androidx.appcompat:appcompat 依赖库中