НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ ТОП-УРОВНЯ: java.lang.IllegalArgumentException: уже добавлено - PullRequest
10 голосов
/ 06 февраля 2012

Я новичок в Android, пытаюсь запустить проект, который хорошо собирается и разворачивается. Но каждый раз, когда я пытаюсь запустить приложение из Eclipse, я получаю эту ошибку:

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lcom/.../model/AvailabilityRequest$DAY_TIME_PREFERENCE;
[2012-02-06 17:32:11 - main-app] Dx     at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
[2012-02-06 17:32:11 - main-app] Dx     at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
[2012-02-06 17:32:11 - main-app] Dx     at com.android.dx.command.dexer.Main.processClass(Main.java:486)
...
[2012-02-06 17:32:11 - main-app] Dx     at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
[2012-02-06 17:32:11 - main-app] Dx 1 error; aborting
[2012-02-06 17:32:11 - main-app] Conversion to Dalvik format failed with error 1

Я убил огромное количество времени за эту глупость. Очевидно, это известная проблема, но у меня ничего не работает.
Что имею:

Операционная система - OS X , что, я думаю, важно;
IDE - затмение 3.7.1
ADT - версия: 15.0.1.v201111031820-219398
Инструмент для сборки - Maven

Что я пробовал до сих пор:
- Свойства-> Путь сборки Java-> Библиотеки, чтобы удалить все библиотеки, кроме Android x.y.z, затем Maven-> Обновить конфигурацию проекта, а также очистить проект;
- Магия с закрытием и повторным открытием затмения;
- Танцы с удалением и воссозданием проекта и библиотек для него (согласно тексту сообщения об ошибке, имеется некоторое дублирование источников, которые находятся в одной из 2 библиотек, используемых в основном проекте).

После того, как один из приведенных выше вариантов (обычно 1-й) начинает работать, но я могу потратить 20 минут, чтобы он заработал, или несколько часов ..., сегодня мне вообще не удается это сделать.

Любая идея будет оценена.

Ответы [ 2 ]

6 голосов
/ 07 февраля 2012

ADT сгенерирует исключение, подобное этому, если ваш путь к классам Eclipse содержит более одного класса с одинаковым именем / пакетом. В этом случае он сталкивается с несколькими экземплярами класса AvailabilityRequest в ваших зависимостях Maven.

Вы можете решить эту проблему, выяснив, какие зависимости classpath содержат одинаковые файлы классов (для этого нужно нажать Ctrl-Alt-T и набрать в AvailabilityRequest).

Затем вы можете открыть свое POM в редакторе POM m2e и перейти на вкладку Иерархия зависимостей. Это позволит вам выбрать постороннюю зависимость, которую затем вы можете исключить, щелкнув правой кнопкой мыши и выбрав «Исключить артефакт Maven ...», который автоматически добавит элемент <exclusions> в ваше POM. Это удалит дубликат JAR из вашего пути к классу Eclipse и позволит вам построить ваш проект.

Кроме того, вы должны быть осторожны с тем, какие зависимости вы добавляете в POM.

3 голосов
/ 10 февраля 2012

Ну, насколько я понимаю, главное, что я использовал maven в качестве инструмента для строительства. Я мог бы создать и развернуть проект без каких-либо проблем, но я не смог запустить его из среды (затмение).

Если я не ошибаюсь, когда вы заходите в Выполнить -> Выполнить конфигурации и запускаете Android-приложение для запуска вашего проекта, вы в основном запрашиваете eclipse (Android SDK) построить .apk с Ant для вас, а не с Maven. Eclipse строит проект с помощью Ant и отправляет сгенерированный .apk на устройство / симулятор. Но так как все настройки проекта находятся в .pom файлах, Ant не может собрать проект и выдает ошибки такого рода.

Решение:
Запустите приложение прямо с устройства / симулятора после его развертывания, а не через меню Выполнить . Если вы хотите отладить ваше приложение, используйте отладку DDMS, а не ту, что предоставляет Eclipse. Если вы не знаете, где находится DDMS (как и я в моем случае) - в Mac это Window-> Open Perspective-> Other ... выберите DDMS из меню; Вы можете поместить его в качестве закладки вместе с Debug и Java для eclipse. В DDMS вы найдете все классные инструменты, включая отладку.

P.S. Это ответ от новичка и для новичков ... Если вы видите что-то, где я ошибаюсь, пожалуйста, дайте мне знать или не стесняйтесь редактировать мой ответ.

...