我有3个模块正在构建。
A(没有依赖项的android库) B(依赖于A的android库) C(依赖于B和A的android应用程序)
首先,我想在C中声明只有B,并且有A传递 第二,我一直得到dex错误:
Unknown source file : UNEXPECTED TOP-LEVEL EXCEPTION:
Unknown source file : com.android.dex.DexException: Multiple dex files define Lorg/apache/commons/collections/Buffer;
Unknown source file : at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
Unknown source file : at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
Unknown source file : at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
Unknown source file : at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Unknown source file : at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
Unknown source file : at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
Unknown source file : at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
Unknown source file : at com.android.dx.command.dexer.Main.run(Main.java:277)
Unknown source file : at com.android.dx.command.dexer.Main.main(Main.java:245)
Unknown source file : at com.android.dx.command.Main.main(Main.java:106)
:app:dexDebug FAILED
我提供模块B,C(A没有任何)
中声明的依赖项B:
dependencies {
compile 'com.me.project:project-base:1.0.0'
compile 'org.apache.httpcomponents:httpcore:4.3'
compile 'org.apache.httpcomponents:httpmime:4.3'
compile 'commons-io:commons-io:2.4'
}
C:
dependencies {
compile 'com.android.support:appcompat-v7:+'
compile 'com.android.support:design:23.1.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
compile 'com.android.support:gridlayout-v7:23.1.0'
compile ('B')
compile 'com.android.support:support-v4:23.1.0'
compile 'commons-validator:commons-validator:1.4.1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
// TODO: check how to make it transitive somehow
compile 'com.me.project:project-base:1.0.0'
// only simbols to compile time
provided 'org.apache.httpcomponents:httpcore:4.3'
provided 'org.apache.httpcomponents:httpmime:4.3'
provided 'commons-io:commons-io:2.4'
}
请帮我解释如何正确配置项目并解决错误
谢谢!
答案 0 :(得分:0)
正如异常消息所示, commons-collections 依赖关系被添加两次。
从快速查看,我发现commons-validator
库取决于commons-collections
。您必须找到commons-collections
是否由另一个依赖项传递添加。
可以帮助您的工具是:
打印所有编译依赖项(从项目的根目录开始,其中app
是应用程序模块的名称):
./gradlew app:dependencies --configuration compile
使用依赖性洞察报告:
./gradlew app:dependencyInsight --configuration compile --dependency commons-collections
如果上述选项无效,则可能将commons-collections类打包在fat-jar中。使用以下任务打印所有编译依赖项,并检查其中一个jar是否包含commons-collections类(使用./gradlew app:printDependencies
运行):
task printDependencies << {
configurations.compile.each { println it.name }
}
作为旁注,commons-validator v1.4.1依赖于vulnerable commons-collections 3.2.1版本。确保你使用的是3.2.2或更高版本的公共收藏品。
答案 1 :(得分:0)
首先,感谢大家的努力。
我收到了这个错误,因为我有两次相同的符号。它来自两个不同的依赖。
我运行gradle依赖项以获取dependecies树来查找这些jar。
之后我在其依赖项下的build.gradle文件中为其中一个添加了'exludes'。
解决了我的问题,因为现在dex进程只有一个符号。
再次感谢大家。你非常乐于助人