Gradle:如何从JScience jar依赖项中排除javax.realtime包(Multiple dex define)

8

我正在我的Android应用中使用Gradle,我想使用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库。我尝试在Gradle中使用以下方式从Jscience库中移除该包进行修复:
sourceSets {
    main {
        java {
            exclude 'javax/realtime/**'
        }
    }
}

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

但这并没有帮助。因此,该软件包仍然存在于依赖项中。 enter image description here 在编译时有没有办法排除一个软件包从jar中?

2
"one is a part of Java" -- 在Android中没有javax.realtime。当您编译Android应用程序时,JDK的类库具有javax.realtime是无意义的,因为您并未使用JDK的类库。 - CommonsWare
谢谢你的回答,你是100%正确的,我的错误。问题在于 javolution 的依赖关系(它来自 JScience 库),因为它包含 javax.realtime 包。 - yyunikov
1个回答

17

如果有人需要,问题在于JScience库的Javolution依赖项中。它们都有一个javax.runtime包。排除Javolution对我来说修复了这个问题。

compile ('org.jscience:jscience:4.3.1') {
    exclude group: 'org.javolution', module: 'javolution'
}

谢谢您。我无法通过通常的路线gradle -q app:dependencies找到重叠的依赖项->如果可以问,您使用了什么命令来深入挖掘应用程序? - AllDayAmazing
我已经不记得了,但我认为可能是使用gradle dependencies命令或Intellij Idea的依赖关系树工具。 - yyunikov
谢谢您。这解决了我在“java.exe以非零退出值2结束”的问题。 - Ralphilius
请注意,gradle 2.10 中出现了 exclude 函数(参见参考文档),您可能需要更新您的 gradle wrapper。 - Nicolas Bossard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接