时间:2015-05-24 12:46:09

标签: android gradle conflict dex

我有一个Android项目,它有一些依赖项,一个是'org.parceler:parceler:0.2.16',另一个是'com.google.guava:guava:18.0'。他们都有'com.google.thirdparty.publicsuffix'包,如下图所示。 Gradle配置与项目成功同步,但是当我想编译项目时,我遇到了这个错误:

Error:Gradle: Execution failed for task ':app:dexDebug'.
  

com.android.ide.common.internal.LoggedErrorException:无法运行命令:       C:\ Users \ Siamak \ AppData \ Local \ Android \ sdk \ build-tools \ 21.1.2 \ dx.bat --dex --no-optimize --output C:\ Users \ Siamak \ AndroidStudioProjects \ HelloWorld \ app \ build \ intermediates \ dex \ debug --input-list = C:\ Users \ Siamak \ AndroidStudioProjects \ HelloWorld \ app \ build \ intermediates \ tmp \ dex \ debug \ inputList.txt   错误代码:       2   输出:       意外的顶级例外情况:       com.android.dex.DexException:多个dex文件定义Lcom / google / thirdparty / publicsuffix / PublicSuffixPatterns;           在com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)           在com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)           在com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)           在com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)           在com.android.dx.merge.DexMerger.merge(DexMerger.java:189)           在com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)           在com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)           在com.android.dx.command.dexer.Main.run(Main.java:246)           在com.android.dx.command.dexer.Main.main(Main.java:215)           在com.android.dx.command.Main.main(Main.java:106)

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:20.0.0'
compile 'com.squareup.retrofit:retrofit:1.6.1'
compile 'com.jakewharton:butterknife:6.1.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile ('org.parceler:parceler:0.2.16')
compile 'org.apache.httpcomponents:httpmime:4.3.5'
compile ('com.google.guava:guava:18.0')

}

对不起图片;-) Image

修改:

在评论中提到的问题不是同样的情况,一个解决方案是在依赖关系部分使用exclude命令,因为我没有项目依赖关系之间的任何传递依赖,它没有用。另一种解决方案是使用特殊的jar文件(带有核心或dep后缀,如'junit-dep'或'mockito-core'),但我找不到任何特定的最新parceler jar文件,其中不包含'com.google.thirdparty .publicsuffix”。 请访问提供的图像链接以更好地了解问题。 感谢。

编辑2:

项目依赖关系树:

+--- com.android.support:appcompat-v7:20.0.0
|    \--- com.android.support:support-v4:20.0.0
|         \--- com.android.support:support-annotations:20.0.0
+--- com.squareup.retrofit:retrofit:1.6.1
|    \--- com.google.code.gson:gson:2.2.4
+--- com.jakewharton:butterknife:6.1.0
+--- com.squareup.picasso:picasso:2.5.2
+--- org.parceler:parceler:0.2.+ -> 0.2.16
|    \--- org.parceler:parceler-api:0.2.16
+--- org.apache.httpcomponents:httpmime:4.3.5
|    \--- org.apache.httpcomponents:httpclient:4.3.5
|         +--- org.apache.httpcomponents:httpcore:4.3.2
|         +--- commons-logging:commons-logging:1.1.3
|         \--- commons-codec:commons-codec:1.6
\--- com.google.guava:guava:18.0

2 个答案:

答案 0 :(得分:0)

听起来主要的问题是org.parceler静态包含一些guava类,而不仅仅是依赖于guava库。

我不知道如何在您的gradle构建中修复此问题,但稍微不同的方法可能是联系库的作者和/或直接提交拉取请求以解决问题。该项目似乎是hosted on github

答案 1 :(得分:0)

如果问题出在Parceler使用Guava ......

Parceler仅在注释处理器中使用Guava,并使用阴影来避免与其他库或直接包含的Guava冲突。因此,您可以通过apt或提供的范围使用Parceler来避免在最终的dex传递中包含Parceler的Guava:

apply plugin: 'android-apt'

dependencies {
    apt 'org.parceler:parceler:1.0.1'
    compile 'org.parceler:parceler-api:1.0.1'
}

虽然我不确定这种冲突是如何发生的,因为阴影的一部分是将Guava的根包从com.google.common重命名为org.parceler.guava