【问题标题】:Android Studio: Resolving Duplicate ClassesAndroid Studio:解决重复类
【发布时间】:2016-08-27 16:01:23
【问题描述】:

当我尝试在 Android 设备上 run 我的 android 应用程序时,gradle 控制台报告以下错误:

Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/loopj/android/http/AsyncHttpClient$1.class

当我搜索“AsyncHttpClient”类时,我发现它确实存在于两个不同的位置:

/Users/Afflatus/.gradle/caches/modules-2/files-2.1/com.loopj.android/android-async-http/1.4.9/5d171c3cd5343e5997f974561abed21442273fd1/android-async-http-1.4.9-sources.jar!/com/loopj/android/http/AsyncHttpClient.java

/Users/Afflatus/.ideaLibSources/android-async-http-1.4.9-sources.jar!/com/loopj/android/http/AsyncHttpClient.java

第一个路径似乎表明它是一个“缓存”文件......所以我尝试了invalidating & restarting my cache,但是在 gradle 重建后这两个文件仍然存在,我尝试run 应用程序。我在备用posts 中读到它可以通过删除其中一个文件来解决......所以我去了缓存位置并删除了在“1.4.9”文件夹中找到的所有文件......不幸的是重新打开后Android Studio,创建了一个新的缓存文件,我得到了同样的错误。

其他帖子(herehereherehere)建议如果我将“./gradlew clean”添加到根目录,它将再次重建 gradle 以供运行(到目前为止我认为)。所以我也尝试这样做:

这使我的应用程序的文件夹看起来像这样:

但不幸的是,这并没有帮助我仍然遇到同样的错误。我究竟做错了什么?我该怎么办?

【问题讨论】:

  • 请问你是怎么解决你的问题的,我遇到的问题和你的一模一样。
  • @DavidCheung 我不认为我解决了它。我想我尝试了安德斯的建议,但似乎对我的特殊情况没有任何作用。也许它会适合你的?
  • 有同样的问题。花了几个小时寻找无济于事的解决方案。
  • 你可以在这里找到好资料:stackoverflow.com/questions/56029393/…

标签: android gradle android-gradle-plugin build.gradle loopj


【解决方案1】:

有时重复类异常意味着您的依赖项之一隐式使用了您也在项目中使用的某些库的较旧或较新(带+)版本,

要解决此问题,您可以将这样的代码块(将您的库版本放在'force' 之后)添加到您的build.gradle 文件(模块:app)中:

configurations {
   all {
      resolutionStrategy {
          // do not upgrade above 3.12.0 to support API < 21 while server uses
          // COMPATIBLE_TLS, or okhttp3 is used in project
          force 'com.squareup.okhttp3:okhttp:3.12.0'
          force 'com.squareup.okhttp3:logging-interceptor:3.12.0'
      }
   }
}

您还可以从依赖项中排除某些组。 对于您编写的单个依赖项:

dependencies {

    // example
    implementation('log4j:log4j:1.2.15') {
        exclude group: 'javax.jms', module: 'jms'
    }
}

经测试可在 Android Studio 上使用 Gradle 插件版本 3.4.2 和 Gradle 版本 5.4.1。 致谢来自 gradle org 讨论组的 Dimitar Dimitrov 和 Schalk Cronjé

【讨论】:

  • 强制后如何使用implementation project(path: ':videocropper') 它不适用于项目路径。请告诉我如何使用它。
  • 什么是jms,为什么要排除它,它与原始错误有什么关系?为什么是模块jms?为什么是 javax.jms 组?这些信息是从哪里来的?
【解决方案2】:

因为您在libs 文件夹中添加了两次库,当您在libs 文件夹中有多个版本的同一库时,有时可能会发生这种情况。检查它并删除所有重复的 jar 文件。

第二个选项可能是您还在gradle.build 中添加了依赖项,并且在libs 文件夹中也有jar。

所以检查这两个地方并删除重复的条目,然后再次清理并构建APK

希望对你有帮助

【讨论】:

  • libs 文件夹的位置是什么?项目的根?
  • 它是 ProjectFolder/app/libs
  • 我们能否将 exclude 与本地 .aar 文件一起使用,并从 2 个 .aar 文件之一中排除重复代码?
【解决方案3】:

删除 libs 文件夹中具有重复 jar 扩展名的文件。但是,如果没有重复文件并且仍然存在"Duplicate classes" 错误,请在错误部分的“重复类...”子句的其余部分中查找名称。例如,"duplicated classes 'dagger' bla bla"。从libs 文件夹中删除名为'dagger' 的文件。 (注意不要用 shift 删除。)

【讨论】:

    【解决方案4】:

    就我而言,我在我的 gradle 中使用了 sensorocloud.jarcompile 'com.loopj.android:android-async-http:1.4.9',这导致了与您相同的错误。因为sensoro cloud SDK使用了loopj的async-http

    我设法通过手动删除 jar 文件中重复的 .class 文件来解决它。 (即

    1. 将扩展名从 jar 更改为 zip
    2. 解压
    3. 删除com.loopj.android.class文件)

    (P.S. 我曾尝试在网上搜索,看看是否可以在 gradle 中排除某些 jar 类,但没有成功,例如我引用了 this SO post

    【讨论】:

    • 这是否对您排除类 PackagingOptions { exclude 'okhttp-2.0.0.jar' exclude 'crashlytics.jar' exclude 'DimenRes.class' exclude 'support-v4' exclude 'AccessToken $1.class' }
    • 我认为这与您提到的排除无关。
    【解决方案5】:

    我将此行添加到我的 gradle.properties 文件中并且我的应用程序正常运行

    android.enableJetifier=true

    【讨论】:

      【解决方案6】:

      检查您的项目是否为 build.gradle。那里可能有一些 Maven 重复依赖项

      【讨论】:

        【解决方案7】:

        此错误可能由多种原因引起;

        1. 错误配置的包名
        2. 未很好绑定的活动视图。 - 只需转到您的启动器活动视图并确保正确定义上下文,例如“com.yourdomain.package”
        3. 重新创建您的 BuildConfig 并设置好。

        【讨论】:

          猜你喜欢
          • 2021-12-12
          • 1970-01-01
          • 2018-03-06
          • 1970-01-01
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 2020-04-20
          • 1970-01-01
          相关资源
          最近更新 更多