java.util.zip.ZipException:重复条目Foo.class

时间:2017-01-21 04:13:41

标签: android gradle

在构建项目时遇到了这个众所周知的异常。

我的问题是: 我怎样才能找到Foo.class的副本(在什么是jars,库中)?

我过去常常解决这样的问题,通常原因是在不同版本的Android库中(支持,播放等等)。我的项目中有10个模块,因此每次我需要比较10 build.gradle中的所有依赖项。

特别是,现在是javax/annotation/CheckForNull.class。我卡住了,找不到任何重复的依赖项。 所以我只需要一个简单的方法来知道 - 哪个库X包含Foo.class,哪个库Y包含Foo.class。有可能吗?

1 个答案:

答案 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