Gradle: как исключить пакет javax.realtime из зависимости JScience jar (несколько определений dex)

Я использую Gradle в своем приложении для Android, и я хотел бы использовать зависимость библиотеки JScience. Я добавил библиотеку следующим образом:

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')

    compile 'org.jscience:jscience:4.3.1'

    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Но во время компиляции получаю ошибку:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Ljavax/realtime/MemoryArea;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

Это вызвано дублированием javax.realtime пакетов в проекте, один из которых является частью JDK, а второй находится в библиотеке Jscience. Я попытался удалить этот пакет из библиотеки Jscience таким образом в Gradle:

sourceSets {
    main {
        java {
            exclude 'javax/realtime/**'
        }
    }
}

configurations {
    all*.exclude group: 'javax.realtime'
}

Но это не помогло. Итак, этот пакет все еще существует в зависимостях. введите здесь описание изображения

Есть ли способ исключить пакет из jar во время компиляции?


person Yuriy Yunikov    schedule 23.05.2014    source источник
comment
один является частью Java — в Android нет javax.realtime. Тот факт, что библиотека классов JDK имеет javax.realtime, не имеет смысла, поскольку вы не используете библиотеку классов JDK при компиляции приложения для Android.   -  person CommonsWare    schedule 24.05.2014
comment
Спасибо за ответ, вы правы на 100%, моя ошибка. Проблема заключалась в зависимости от javolution (которая исходит из библиотеки JScience), поскольку она содержит пакет javax.realtime.   -  person Yuriy Yunikov    schedule 24.05.2014


Ответы (1)


Если кому нужно, проблема была в Javolution зависимости от JScience библиотеки. У них обоих есть пакет javax.runtime. Исключение Javolution устранило проблему для меня.

compile ('org.jscience:jscience:4.3.1') {
    exclude group: 'org.javolution', module: 'javolution'
}
person Yuriy Yunikov    schedule 24.05.2014
comment
Спасибо тебе за это. Я не смог найти перекрывающиеся зависимости по обычному маршруту gradle -q app:dependencies -> какую команду вы использовали, чтобы копаться в приложении, если я могу спросить? - person AllDayAmazing; 05.04.2015
comment
Я уже не помню, но я думаю, что может быть какая-то команда gradle dependencies или инструмент дерева зависимостей Intellij Idea - person Yuriy Yunikov; 05.04.2015
comment
Спасибо тебе за это. Это решило мою проблему с завершением java.exe с ненулевым значением выхода 2.. - person Ralphilius; 18.04.2015
comment
Обратите внимание, что функция исключения (см. справочный документ) появился в Gradle 2.10, вам может потребоваться обновить оболочку Gradle. - person Nicolas Bossard; 09.02.2016