【问题标题】:Exclude one class file in gradle Android Studio在 gradle Android Studio 中排除一个类文件
【发布时间】:2017-07-04 20:08:34
【问题描述】:

在我的项目中,我需要导入第三方 jar 文件和 Facebook SDK。

compile files('libs/SkinSDK.jar')
compile 'com.facebook.android:facebook-android-sdk:4.14.0'

两者都包含相同的BundleJSONConverter 类。所以,我不能生成签名的 APK。它总是显示重复的条目 com/facebook/internal/JSONConverter。

所以,我想在 Facebook 或 SkinSDK.jar 中排除。我试过了

compile ('com.facebook.android:facebook-android-sdk:4.14.0') {
    exclude group: 'com.facebook.internal', module: 'BundleJSONConverter'
}

它不起作用并显示相同的错误。

【问题讨论】:

    标签: java android gradle facebook-sdk-4.x


    【解决方案1】:

    依赖配置闭包的exclude 方法不包括传递依赖。因此,如果您的模块依赖项依赖于其他模块,您可以将它们从构建中排除。您可以在其Maven repository info page 上查看'com.facebook.android:facebook-android-sdk:4.14.0' 模块的传递依赖关系。

    如果BundleJSONConverter 类存在于传递依赖中,您可以按照您现在尝试的相同方式排除特定模块。只需指定 groupmoduleversion,就像对依赖项所做的那样。

    如果您只想为依赖项 jar 排除一个类,请查看jar jar links 工具及其 Gradle 插件。它允许您更改包含的罐子,例如更改包或删除类。

    下面的(shortened) example展示了插件的用法和一些改变依赖jar的方法:

    compile jarjar.repackage {
        from 'org.apache.hive:hive-exec:0.13.0.2.1.5.0-695'
    
        archiveBypass "commons*.jar"
        archiveExclude "slf4j*.jar"
    
        classDelete "org.apache.thrift.**"
        classRename 'org.json.**', 'org.anarres.hive.json.@1'
    }
    

    【讨论】:

    • 无法获取我正在获取的未知属性 jarjar。怎么办?
    • @Nallamachu 您需要包含 jar jar 链接 插件。遗憾的是,它无法通过 Gradle 插件门户获得,因此您不能只使用 plugins 闭包。请查看完整的example build.gradle
    • 我们可以将这个库用于 libs 文件夹中的 jar 文件吗?如果是,那么闭包中 from 的值应该是什么,比如 jar 文件是 libs/my-sample.jar?
    【解决方案2】:

    遇到了类似的情况。这就是我所做的,并不像我希望的那样优雅,但它确实有效:

    1. 重命名 jar 文件(在您的情况下为 SkinSDK.jar):.zip 而不是 .jar

    2. 进入 zip 文件“内部”(我使用的是 DoubleCommander,还有许多其他实用程序),或将其解压缩到一个临时文件夹。

    3. 删除导致问题的重复类。转到 zip 文件的“外部”。

    4. 将文件从 .zip 重命名(或重新打包)为 .jar 。编译。

    希望它有效...

    【讨论】:

    • 缩短此过程:无需重命名或重新打包存档。任何jar 文件都是zip 文件,您应该可以使用各种工具(例如7-zip)打开它。
    • 另外,请记录此jar 文件更改!否则更新外部库时会遇到问题。
    • 请注意,问题是关于使用 gradle 而不是手动进行
    【解决方案3】:

    在导入 jar 后,我遇到了与重复类类似的问题。就我而言,冲突发生在该 jar 中的一个类和我自己项目中的一个类之间。 下面我分享一个解决方案,你可以用来丢弃你自己的源代码树中可用的类,假设 jar 中的那个是正确的:

    android {
       sourceSets {
         main {
           java {
                filter.excludes = [
                        "com/package/Duplicated.java",                      
                ]
           }
         }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多