在构建项目时遇到了这个众所周知的异常。
我的问题是:
我怎样才能找到Foo.class
的副本(在什么是jars,库中)?
我过去常常解决这样的问题,通常原因是在不同版本的Android库中(支持,播放等等)。我的项目中有10个模块,因此每次我需要比较10 build.gradle
中的所有依赖项。
特别是,现在是javax/annotation/CheckForNull.class
。我卡住了,找不到任何重复的依赖项。
所以我只需要一个简单的方法来知道 - 哪个库X包含Foo.class
,哪个库Y包含Foo.class
。有可能吗?
答案 0 :(得分:0)
将此添加到您的build.gradle
task findDuplicates {
doLast {
def pathMap = [:]
def jars = configurations.runtime.asFileTree.matching {
include '*.jar'
}
jars.visit { FileVisitDetails fvd ->
FileTree classTree = zipTree(fvd.file).matching {
include '**/*.class'
}
classTree.visit { FileVisitDetails fvd2 ->
String path = fvd2.relativePath.pathString
List<String> jarList = pathMap[path]
if (!jarList) {
jarList = []
pathMap[path] = jarList
}
jarList << fvd.file.name
}
}
pathMap.each { path, jarList ->
if (jarList.size() > 1) {
println "Duplicate $path at $jarList"
}
}
}
}
然后从命令行调用gradle findDuplicates