jar包冲突的解决,依赖树的打印与分析

当引入新jar包导致版本冲突时,Gradle的默认策略可能隐藏问题。冲突可能导致单元测试失败。解决方法包括升级冲突jar或使用exclude排除依赖。在IDEA中定位冲突类,使用`gradlew dependencies`或`dependencyInsight`命令分析依赖树。升级陈旧版本前需详查业务代码,消除传递依赖可强制统一版本,避免jar中jar现象。Gradle有一套选择重复jar的机制确保war包内只有一种版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们引入新的jar包时候可能会因为传递依赖,引入现有项目中存在,但是版本不同的jar,从而引起jar包冲突,在有些情况下,运行并不会出现问题,其中的原因是:gradle有一套策略,在构建时候为我们进行了选择,实际线上部署的项目中只有一个版本的jar。 有时候,会导致单元测试不能运行,因此,我们需要找到冲突的jar,并对陈旧的版本进行升级,或者对传递依赖进行排除;

其中排除依赖的方式maven和gradle不同,这里讨论gradle管理的情况;
但是都可以使用exclude

dependencies {    compile("com.aaa:web:1.0") {        exclude group: 'org.unwanted', module: 'iAmBuggy'     }       }
如何排除很多资料,可以参考 https://blog.youkuaiyun.com/pkaq_/article/details/53906668

这里再梳理一下如何发现冲突的jar,及其版本,解决思路

1.首先会发现 NoClassDef 、NoSuchMethod 等异常,根据堆栈信息, 在项目中找寻这个类。(IDEA 双击shift)。一般会发现两个类。这时候, 其实你已经可以看到两个jar的版本了。
2. 然后,使用

gradlew webapp-module-name:dependencies
gradlew dependencyInsight --dependency slf4j-api

命令,打印依赖树; 分析依赖关系,找到不同版本的依赖方。

3. 知道了是哪些内容,引入了不同jar,接着就是解决他们。主要的思路是,

A, 升级陈旧版本, 对于一些不冲突不引起异常的升级这里是提倡的,但是也要细细阅读相关使用的业务代码和jar源码,确保无误后; 提请测试,进行回归和压力测试。
B,消除传递依赖, 强制使用某个统一的依赖版本等,不是消除他们而是规避


领会:

1. 传递依赖的jar 不会打到这个A jar中形成jar中jar,项目所有直接间接依赖的jar都会放在同级目录下, 会放在最外层的公共依赖jar中
2. gradle 有一套选择重复jar 的机制,保证在形成的可执行war包中,只有同一个jar包的一个版本;关于选择策略可以参照: https://www.cnblogs.com/gzdaijie/p/5296624.html
### 如何在Java项目中模拟JAR包依赖冲突 在Maven项目的`pom.xml`文件中定义多个不同版本的相同库可以创建JAR包依赖冲突的情景。当两个或更多相互矛盾的依赖项存在时,可能会导致不可预测的行为、编译错误或是运行期异常。 #### 修改POM文件引入冲突依赖 通过编辑`pom.xml`并故意加入不兼容的不同版本的同一个库作为直接或传递依赖来制造这种场景: ```xml <dependencies> <!-- 明确指定较低版本 --> <dependency> <groupId>com.example</groupId> <artifactId>example-library</artifactId> <version>1.0.0</version> </dependency> <!-- 添加另一个模块, 它可能携带更高版本的同一库作为间接依赖 --> <dependency> <groupId>com.anothergroup</groupId> <artifactId>another-module</artifactId> <version>2.0.0</version> </dependency> </dependencies> ``` 上述配置可能导致`example-library`有两个不同的版本被加载到classpath中[^1]。 #### 使用命令行工具查看实际解析后的依赖树 为了确认确实发生了冲突以及理解具体哪个版本最终胜出,可利用Maven自带的帮助插件展示完整的依赖关系图谱: ```bash mvn dependency:tree ``` 此命令会打印出整个项目的依赖层次结构,并指出任何重复或者覆盖的情况。 #### 解决方案探索 一旦成功重现了jar包冲突现象,在解决问题的过程中还可以尝试多种策略比如排除特定子依赖(`exclusions`)、锁定某些组件的具体版次范围等手段来进行修复实验,从而更好地掌握处理此类问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值