我正在尝试在新的裸露的Android Studio项目中包含一个库。

我的模块的build.gradle包含以下内容:

repositories {
    mavenCentral()
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'org.jmrtd:jmrtd:0.5.0-RELEASE'
}

使用以下堆栈跟踪,在preDexDebug步骤构建并运行失败:
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lnet/sf/scuba/data/Country;
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:122)
    at com.android.dx.dex.file.DexFile.add(DexFile.java:161)
    at com.android.dx.command.dexer.Main.processClass(Main.java:732)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
    at com.android.dx.command.dexer.Main.access$300(Main.java:83)
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:632)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
    at com.android.dx.command.dexer.Main.run(Main.java:246)
    at com.android.dx.command.dexer.Main.main(Main.java:215)
    at com.android.dx.command.Main.main(Main.java:106)
1 error; aborting

现在,我一直在寻找所有可能导致此问题(包括多个库)但似乎找不到罪魁祸首的明显问题。该库仅包含一次,并且是唯一的依赖项,除了Android支持库。

错误的包含似乎来自JMRTD中的传递依赖。排除或包括此库(水肺)似乎没有什么区别。

我也尝试过将库手动添加到我的libs文件夹中,但是存在相同的问题。

有趣的是,如果我像这样完全排除传递依赖...
configurations {
    all*.exclude group: 'net.sf.scuba', module: 'scuba-smartcards'
}

... preDexDebug步骤在另一个文件上失败(该文件本身是库的一部分,不包含在依赖项中):
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lorg/jmrtd/BACDeniedException;
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:122)
    at com.android.dx.dex.file.DexFile.add(DexFile.java:161)

旁注:如果您按字母顺序查看jar内容,则失败的文件是列出的第一个文件,表明所有类文件都将以相同的方式失败。

是否存在某种我不知道的内部重复?我包括的 Artifact 在检查时看起来还不错,但是从存储库中提取的文件格式是否可能存在问题?

谢谢!

免责声明:我是Android和Gradle的新手。我在Maven和Java方面拥有丰富的经验。

最佳答案

对于那些可能遇到类似问题的用户:事实证明,这是由于两个相关库(jmrtd + scuba)的 Ant 构建错误而导致的,其中每个库文件包含两次。由于某些文件管理器不会列出存档的重复内容,因此很难检测到。

我最终通过运行'tar tf'来发现重复项并通过使用ant jar-task属性'duplicate =“preserve”'构建自己的libs对其进行了修复。

通常,根本原因是ant在添加重复文件时添加两个相同文件而不是失败/覆盖以及Gradle的挑剔,这是ant可怕的默认行为。

08-18 01:29
查看更多