【问题标题】:Using two JAR dependency files with same package inside使用内部具有相同包的两个 JAR 依赖文件
【发布时间】:2015-05-24 12:46:08
【问题描述】:

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

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

编辑:

在 cmets 中提到的问题不是相同的情况,一种解决方案是在依赖项部分使用排除命令,因为我在项目依赖项之间没有任何传递依赖项,它没有用。另一种解决方案是使用特殊的 jar 文件(带有 core 或 dep 后缀,如“junit-dep”或“mockito-core”),但我找不到任何不包含“com.google.thirdparty”的特定最新 parceler jar 文件.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

【问题讨论】:

标签: android gradle conflict dex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果问题在于 Parceler 对 Guava 的使用...

    Parceler 仅在注解处理器中使用 Guava,并对其进行了阴影处理,以避免与其他库或直接包含 Guava 冲突。因此,您可以通过 apt 或提供的范围使用 Parceler 来避免在最终的 dex pass 中包含 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2013-09-26
      • 2018-03-10
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多