Исключить один файл класса в Gradle Android Studio
В моих проектах мне нужно импортировать сторонний jar-файл и Facebook SDK.
compile files('libs/SkinSDK.jar')
compile 'com.facebook.android:facebook-android-sdk:4.14.0'
Оба включают одинаковые BundleJSONConverter
учебный класс. Таким образом, я не могу создать подписанный APK. Он всегда показывает дубликат записи com/facebook/internal/BundleJSONConverter.
Итак, я хочу исключить в Facebook или SkinSDK.jar. Я пробовал как
compile ('com.facebook.android:facebook-android-sdk:4.14.0') {
exclude group: 'com.facebook.internal', module: 'BundleJSONConverter'
}
Это не работает и показывает ту же ошибку.
3 ответа
exclude
Метод закрытия конфигурации для зависимости исключает транзитивные зависимости. Таким образом, если зависимость вашего модуля зависит от других модулей, вы можете исключить их из вашей сборки. Вы можете проверить переходные зависимости 'com.facebook.android:facebook-android-sdk:4.14.0'
модуль на своей странице информации о репозитории Maven.
Если BundleJSONConverter
класс существует в транзитивной зависимости, вы можете исключить конкретный модуль так же, как вы пытаетесь сейчас. Просто укажите group
, module
и version
, как вы делаете для зависимостей.
Если вы просто хотите исключить один класс для jar зависимостей, взгляните на инструмент jar jar links и его плагин Gradle. Это позволяет вам изменять включенные файлы jar, например, изменять пакеты или удалять классы.
В следующем (сокращенном) примере показано использование плагина и некоторых методов для изменения 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'
}
Наткнулся на похожую ситуацию. Это то, что я сделал, не элегантно, как я надеялся, но это работает:
Переименуйте файл JAR (SkinSDK.jar в вашем случае): .zip вместо.jar
Перейдите "внутри" zip-файла (я использую DoubleCommander, для этого есть много других утилит) или извлеките его во временную папку.
Удалите дублирующий класс, который вызывает проблему. Выйдите "за пределы" почтового файла.
Переименуйте (или перепакуйте) файл из.zip в.jar. Компиляция.
Надеюсь, что это работает...
У меня была аналогичная проблема с дублированными классами после импорта банки. В моем случае конфликт возник между классом в этой банке и классом в моем собственном проекте. Ниже я делюсь решением, которое вы можете использовать для отбрасывания классов, доступных в вашем собственном дереве исходных текстов, при условии, что тот, который находится в банке, является правильным для использования:
android {
sourceSets {
main {
java {
filter.excludes = [
"com/package/Duplicated.java",
]
}
}
}
}