我正在尝试在我的新骨架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'
}
使用以下stacktrace在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内容,则文件失败是列出的第一个文件,表明所有类文件都会以相同的方式失败。
是否存在某种我不知道的内部重复?我所包含的工件在检查时看起来很好但是从repo中提取的文件的格式是否存在问题?
谢谢!
免责声明:我是Android和Gradle的新手。我在Maven和Java方面有丰富的经验。
答案 0 :(得分:3)
对于那些可能遇到类似问题的人:原来这是由于两个有问题的库(jmrtd + scuba)的一个糟糕的ant构建引起的,其中包括每个类文件两次。这很难被发现,因为一些文件管理器不会列出重复的档案内容。
我最终通过运行' tar tf'通过使用ant jar-task属性自己构建libs来修复diplicates并修复它:复制="保留"'。
一般来说,根本原因是ant在添加两个相同的文件而不是失败/覆盖以及处理重复项时Gradle的挑剔时,可怕的默认行为。