Сборка Android работает в Eclipse, но не с Ant (уже добавлено)

В моем проекте Android используется несколько подмодулей git, помеченных как библиотеки Android. Все эти подмодули по-разному используют jar-файлы ORMlite для Android, и, таким образом, jar-файлы ORMlite включены в их каталог libs. Eclipse правильно обрабатывает эту ситуацию: он включает jar-файлы ORMlite один раз во время обработки dex и генерирует действительный .apk, но когда я запускаю сборку через ant debug, я получаю:

 [echo] Converting compiled files and external libraries into /home/webedit/.hudson/jobs/xyz/workspace/bin/classes.dex...
[apply] 
[apply] UNEXPECTED TOP-LEVEL EXCEPTION:
[apply] java.lang.IllegalArgumentException: already added: Lcom/j256/ormlite/android/AndroidCompiledStatement;
[apply]     at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
[apply]     at com.android.dx.dex.file.DexFile.add(DexFile.java:143)
[apply]     at com.android.dx.command.dexer.Main.processClass(Main.java:338)
[apply]     at com.android.dx.command.dexer.Main.processFileBytes(Main.java:315)
[apply]     at com.android.dx.command.dexer.Main.access$100(Main.java:56)
[apply]     at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:266)
[apply]     at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244)
[apply]     at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:130)
[apply]     at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
[apply]     at com.android.dx.command.dexer.Main.processOne(Main.java:284)
[apply]     at com.android.dx.command.dexer.Main.processAllFiles(Main.java:220)
[apply]     at com.android.dx.command.dexer.Main.run(Main.java:176)
[apply]     at com.android.dx.command.dexer.Main.main(Main.java:157)
[apply]     at com.android.dx.command.Main.main(Main.java:89)

Есть ли способ разместить несколько копий одного и того же JAR в нескольких библиотеках? Есть ли параметр сборки Ant, который я могу изменить, чтобы заставить его работать?


person magneticMonster    schedule 23.02.2011    source источник


Ответы (4)


у меня возникла та же проблема с использованием maven, потому что он правильно добавил файл ormlite-core-jarfile, который содержит пакеты и классы в качестве core-jar с несколькими дополнительными классами.

Я добавил исключение, и теперь оно работает

            <dependency>
                <groupId>com.j256.ormlite</groupId>
                <artifactId>ormlite-android</artifactId>
                <version>4.9</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.j256.ormlite</groupId>
                        <artifactId>ormlite-core</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
person cproinger    schedule 15.01.2012
comment
моя ошибка: уже добавлено: Lcom/j256/ormlite/dao/BaseDaoImpl$1 - person cproinger; 16.01.2012
comment
Это то, что я искал :) Спасибо! - person Richard Lalancette; 10.07.2012
comment
новая текущая версия ormlite, кажется, не страдает от этой проблемы - person cproinger; 15.07.2012
comment
Я использую Android-студию с gradle и испытываю ту же проблему. Я добавил зависимость в build.gradle через compile 'com.j256.ormlite:ormlite-android:4.9', и библиотеки были загружены и связаны, как и ожидалось. Но поскольку банки содержат несколько повторяющихся классов, я получаю исключение already added: Lcom/j256/ormlite/dao/BaseDaoImpl$1. Есть идеи, как решить эту проблему с помощью инструментов gradle и build 18.0.1? - person cybergen; 05.08.2013
comment
@cybergen, вы можете попробовать более новую версию (4.46 в настоящее время является самой новой), как я уже упоминал ранее, я не получил ошибку с более новой версией. в противном случае попробуйте исключить транзитивную зависимость (49.4.7. gradle.org/docs/current /userguide/dependency_management.html) - person cproinger; 05.08.2013
comment
@cproinger, о, ВАУ, теперь это работает! Я неправильно понял версию (моя вина). Но в любом случае более новая версия (4.46) содержит только классы, специфичные для Android, в ormlite-android.jar и все остальное в ormlite-core.jar. Большое спасибо! - person cybergen; 07.08.2013

Я решил свою проблему, создав третий проект Android, содержащий только JAR-файл ORMlite, от которого зависели два других проекта.

person magneticMonster    schedule 24.02.2011

Моя проблема заключалась в том, что были включены все банки в любой папке ./libs, а не только те, которые указаны в моем eclipse .classpath. Так что у меня там лежало несколько дубликатов. Мне просто нужно было почистить мой ./libs. Вы можете узнать, что ant включает в свой «путь к классам», запустив «ant -v debug» где-то в верхней половине вывода.

person pjv    schedule 14.06.2011

Была такая же проблема, но с android-support-v4.jar — он использовался в библиотеке ссылочного проекта и проекте приложения. Вот решение

Обходной путь: 1. Удалите файл android-support-v4.jar из App/libs 2. В Eclipse добавьте jar со ссылкой на ReferencedProjectLibrary/libs/android-support-v4.jar

Это работает и в Eclipse, и в Ant;)

person Oleksii Malovanyi    schedule 11.11.2011