android - 您可以在 android gradle 中使用 packagingOptions 排除类吗?

标签 android gradle android-gradle-plugin

我正在尝试确定是否可以排除类文件或对 jar 文件依赖项中的类使用 pickfirst。我们似乎总是遇到第三方库将 jar 打包在 aar 文件中而不是使用 gradle 依赖项的问题,因此导致重复文件 zip 异常:

像这样:

com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: org/apache/commons/codec/StringEncoderComparator.class

到目前为止,我们找到的唯一解决方案是解压缩 aar,删除有问题的 jar,然后重新压缩。有没有办法从 gradle 中排除 jar 或类?

查看源代码似乎我应该能够使用打包选项。所以我尝试了 pick first 和 exclude 的各种组合,但没有成功:

packagingOptions {
    pickFirst '**/StringEncoderComparator.class'
    pickFirst 'org/apache/commons/codec/StringEncoderComparator.class'
    pickFirst 'org/apache/commons/codec/*'

}

最佳答案

使用resolutionStrategy。

https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html

apply plugin: 'java' //so that there are some configurations

configurations.all {
  resolutionStrategy {
    // fail eagerly on version conflict (includes transitive dependencies)
    // e.g. multiple different versions of the same dependency (group and name are equal)
    failOnVersionConflict()

    // prefer modules that are part of this build (multi-project or composite build) over external modules
    preferProjectModules()

    // force certain versions of dependencies (including transitive)
    //  *append new forced modules:
    force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4'
    //  *replace existing forced modules with new ones:
    forcedModules = ['asm:asm-all:3.3.1']

    // add dependency substitution rules
    dependencySubstitution {
      substitute module('org.gradle:api') with project(':api')
      substitute project(':util') with module('org.gradle:util:3.0')
    }

    // cache dynamic versions for 10 minutes
    cacheDynamicVersionsFor 10*60, 'seconds'
    // don't cache changing modules at all
    cacheChangingModulesFor 0, 'seconds'
  }
}

关于android - 您可以在 android gradle 中使用 packagingOptions 排除类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40564124/

相关文章:

java - 如何在 Activity 上显示标题栏

android - 当我尝试生成android build时,我无法确定任务 ':compileDebugJavaWithJavac'错误的依赖性

configuration - 为什么我必须为相同的依赖项同时指定 'runtime' 和 'compile'?

android - 带有 Gradle 7 的 AppDistribution Gradle 插件

google-maps-android-api-2 - "Google Maps Mobile SDK for Work"的 gradle 依赖项是什么?

php - 从 Android 到 MySQL Blob 的图像

grails - 如何从Windows命令行在Gradle项目中运行Groovy脚本

android - 如何在Android库项目中按测试类型分隔源文件?

android - 使用 Intent 时在库模块中使用应用程序模块依赖

android - 滚动 ListView 时数据解释错误