使用gradle dependencyInsight来查找冲突的依赖包
-
问题描述
项目使用grails3开发, 包含了一些依赖之后,运行的时候会报告slf4j-logback和slf4j-log4j12有冲突. 但是并不知道是哪些包使用了logback, 那些包使用了slf4j-log4j12.
可以使用如下的配置块来exclude slf4j-log4j12包的依赖
configurations.all { // resolutionStrategy.eachDependency { DependencyResolveDetails details -> // if (details.requested.name == 'log4j') { // details.useTarget "org.slf4j:log4j-over-slf4j:1.7.21" // } // if (details.requested.name == 'commons-logging') { // details.useTarget "org.slf4j:jcl-over-slf4j:1.7.21" // } // } exclude group: 'org.slf4j', module: 'slf4j-log4j12' }这样在整个工程中都会排除掉slf4j-log4j12包。
如果想要查找这个log包是被哪个项目中配置的依赖包含进来的,怎么办?
-
使用gradle dependencies
可以使用gradle dependencies,将所有依赖重定向到一个文件中,然后查找. 这样会发现很多slf4j的依赖,比较难找
./gradlew dependencies >aa.txt 2>&1 -
使用gradle dependencyInsight, 反过来查找transitive dependency对应的项目中的最顶层的依赖配置项
这样就很清楚的可以查看冲突的传递包被哪些顶层依赖包包含了。 可以有选择的exclude掉
./gradlew dependencyInsight --dependency slf4j-log4j12 :api-portal:dependencyInsight org.slf4j:slf4j-log4j12:1.7.22 (selected by rule) org.slf4j:slf4j-log4j12:1.6.1 -> 1.7.22 +--- com.101tec:zkclient:0.7 | \--- org.apache.kafka:kafka_2.11:0.9.0.1 | +--- compile | +--- project :common | | \--- compile | \--- project :myplugin | \--- compile \--- org.apache.zookeeper:zookeeper:3.4.6 +--- org.apache.kafka:kafka_2.11:0.9.0.1 (*) \--- com.101tec:zkclient:0.7 (*) org.slf4j:slf4j-log4j12:1.7.6 -> 1.7.22 \--- org.apache.kafka:kafka_2.11:0.9.0.1 +--- compile +--- project :common | \--- compile \--- project :myplugin \--- compile (*) - dependencies omitted (listed previously) BUILD SUCCESSFUL Total time: 3.183 secscompile (group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.9.0.1') { exclude group: 'org.slf4j', module: 'slf4j-log4j12' } or when appropriate, do it globally for all configurations: configurations { all*.exclude group: 'org.slf4j', module: 'slf4j-log4j12' } -
参考:
Written on April 27, 2017
