Fork me on GitHub

如何解决使用Gradle时出现的jar包冲突

前言

在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果有两个包依赖于相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突。

也就是说,在理论上使用Gradle一般情况下,不会出现jar包冲突,那么为什么会有今天这篇博文呢?

Gradle可以帮你管理的是版本不同但是包相同的依赖。但是如果两个原本就不同的依赖之间互相发生冲突,这样的冲突Gradle就不能自动帮你完成了,因为它也不知道你需要哪一个。

 

问题描述

我这边以我出现的冲突为例:

项目启动的时候,在控制台出现下述错误

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/workSoftware/gradleRepository/caches/modules-2/files-2.1/org.slf4j/slf4j-log4j12/1.7.25/110cefe2df103412849d72ef7a67e4e91e4266b4/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/workSoftware/gradleRepository/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.1.11/ccedfbacef4a6515d2983e3f89ed753d5d4fb665/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J:
Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)

其中重要的部分我已经标出,显而易见的是,log4j-over-slf4j.jar 这个包和slf4j-log4j12.jar 包出现了冲突。

这是两个完全不一样的包,但是也出现了冲突,Gradle没有办法进行处理,所以我们需要手动去处理它。

 

问题解决

首先查看所有的依赖,你可以使用gradlew -q app:dependencies命令进行查看,如果是使用idea的话,在gradle的窗口中就有这个选项,双击运行就可以

QQ截图20180204111602

出现的依赖如下所示

\--- com.baidu.unbiz:fluent-validator-jsr303:1.0.9
     +--- com.baidu.unbiz:fluent-validator:1.0.9
     |    +--- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
     |    \--- org.slf4j:slf4j-log4j12:1.7.7 -> 1.7.25
     |         +--- org.slf4j:slf4j-api:1.7.25
     |         \--- log4j:log4j:1.2.17
     +--- org.hibernate:hibernate-validator:5.2.1.Final -> 5.3.5.Final (*)
     +--- javax.el:javax.el-api:2.2.4
     +--- org.glassfish.web:javax.el:2.2.4
     |    \--- javax.el:javax.el-api:2.2.4
     +--- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
     \--- org.slf4j:slf4j-log4j12:1.7.7 -> 1.7.25 (*)

我只是截取了部分,你需要查看所有的依赖已确定你的冲突是发生在什么位置,从而确定你需要怎么去处理

我所需要所的是排除log4j12这个依赖

所以修改gradle配置中的依赖如下所示

compile (group: 'com.baidu.unbiz', name: 'fluent-validator-jsr303', version: '1.0.9'){
exclude module: 'slf4j-log4j12'
}
然后重新启动项目,冲突解决

 
 

总结

其实依赖冲突在很多时候gradle已经帮我们处理好了,如果真的发生上述不可预见的冲突,gradle也会给出很明确的提示。我们所要做的是冷静分析错误的信息,然后进行仔细推敲处理就可以了。

 

posted @   LinkinStar  阅读(8430)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2017-02-04 Chapter 3 Phenomenon——14
点击右上角即可分享
微信分享提示