2015-02-05 67 views
2

我试图在新的裸机Android Studio项目中包含一个库。Gradle在包含库时出现'IllegalArgumentException:已添加'失败

我模块的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) 

旁注:失败的文件中列出的第一个文件,如果你按字母顺序查看罐子里的内容,这表明所有的类文件会以同样的方式失败。

有没有我不知道的内部重复?我包括的工件在检查时看起来很好,但是从回购中获取的文件的格式可能存在问题吗?

谢谢!

声明:我是Android和Gradle的新手。尽管Maven和Java我有丰富的经验。

回答

3

对于那些可能有类似问题的人:原来这是由两个包含每个类文件的问题库(jmrtd + scuba)的一个坏的ant构建引起的。这很难检测到,因为一些文件管理器不会列出重复的档案内容。

我最终通过运行'tar tf'来发现重复并通过使用ant jar-task属性'duplicate =“preserve''自己构建库来修复它。

一般来说,根本原因是ant的可怕的默认行为是添加两个相同的文件,而不是在处理重复项时将失败/覆盖与Gradle的挑剔结合在一起。

+0

我按照建议修正了我的ant脚本(jar任务直接从Sonatype示例中复制,它看起来像重复只出现在构建于OS X而不是Linux上)。感谢您报告@halvdanhg。 – martijno 2015-07-16 08:01:33

+0

@halvdanhg你好,你会偶然有那些jar吗?我有完全相同的问题,我需要这个库的确切版本。你介意给我一些你用来编译源代码的详细命令吗? – lweingart 2015-10-27 14:59:44

+0

@lweingart这是我的解决方案中所有非常详细的描述:我在build xml文件中为每个ant任务添加了duplicate =“preserve”并运行构建。值得注意的是,构建需要在系统上提供一些依赖关系,并为它们设置env变量。你会从构建文件本身中找出它。话虽如此,图书馆的新版本没有这些问题,所以你应该使用这些。 – halvdanhg 2015-10-28 20:38:41

相关问题