NoClassDefFoundError разрабатывает библиотеку с Android-приложением, Maven и Eclipse

Я разрабатываю библиотеку Android (SiriRestClient), артефакты которой управляются через Maven. , и я использую Eclipse для разработки. Я упаковываю артефакты в виде JAR-файла, так как у меня нет никаких активов в проекте, только классы Java, и есть выдает артефакты упаковки в виде apklib с Eclipse/Maven/ADT.

Я также разрабатываю приложение пользовательского интерфейса для Android (SiriRestClientUI), которое зависит от библиотека SiriRestClient. Я управляю зависимостью от библиотеки SiriRestClient через Maven.

Оба проекта строятся и развертываются независимо друг от друга в Eclipse.

ЭТА ПРОБЛЕМА:

Поскольку я начал управлять зависимостью SiriRestClientUI от библиотеки SiriRestClient через Maven, если проект библиотеки и SiriRestClientUI одновременно открыты в Eclipse, я получаю NoClassDefFoundError при попытке развернуть приложение SiriRestClientUI на устройстве.

Например:

11-01 16:11:52.288: E/AndroidRuntime(9409): java.lang.NoClassDefFoundError: edu.usf.cutr.siri.android.client.config.SiriJacksonConfig
11-01 16:11:52.288: E/AndroidRuntime(9409):     at edu.usf.cutr.siri.android.ui.MainActivity.onCreate(MainActivity.java:100)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.Activity.performCreate(Activity.java:4470)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.access$600(ActivityThread.java:128)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.os.Looper.loop(Looper.java:137)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at android.app.ActivityThread.main(ActivityThread.java:4514)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at java.lang.reflect.Method.invokeNative(Native Method)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at java.lang.reflect.Method.invoke(Method.java:511)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
11-01 16:11:52.288: E/AndroidRuntime(9409):     at dalvik.system.NativeStart.main(Native Method)`

Это сильно раздражает во время одновременного процесса разработки библиотеки и приложения, поскольку единственный обходной путь, который я нашел, — это отредактировать код библиотеки, создать проект библиотеки, закрыть проект библиотеки, а затем выполнить приложение SiriRestClientUI.

Я думаю, что проблема связана с тем, как Eclipse/Maven обрабатывает зависимости Maven, когда проект библиотеки открыт.

Вот снимок экрана Eclipse, показывающий проект SiriRestClientUI, когда проект библиотеки (SiriRestClient, над ним) ЗАКРЫТ:

введите здесь описание изображения

Вы можете увидеть файл sirirestclient-1.0.0-SNAPSHOT.jar в разделе «Зависимости Maven», извлеченный из моего локального репозитория Maven, чего я и хочу. В этой конфигурации все работает нормально.

Однако, когда я ОТКРЫВАЮ проект библиотеки SiriRestClient, мои записи «Maven Depedencies» изменяются, и файл JAR исчезает, и вместо этого отображается папка для проекта:

введите здесь описание изображения

Если я попытаюсь запустить SiriRestClientUI, когда оба проекта открыты, я получу ошибку NoClassDefFoundError. Итак, кажется, что Eclipse перенаправляет сборку проекта, а классы библиотеки не включаются.

ВОПРОС:

Как настроить Eclipse/Maven так, чтобы он всегда полагался на файл JAR в локальном репозитории Maven вместо переключения зависимости Maven на локальный проект?

Или есть другой способ избавиться от NoClassDefFoundError с этой конфигурацией?

Файл pom.xml для проекта библиотеки находится здесь.

Файл pom.xml для проекта приложения SiriRestClientUI находится здесь.


person Sean Barbeau    schedule 01.11.2012    source источник


Ответы (2)


Попробуйте это: щелкните правой кнопкой мыши проект -> Свойства -> Maven -> снимите флажок Resolve dependencies from Workspace projects.

person Aleksandr M    schedule 01.11.2012

вам нужно обязательно две вещи, во-первых: зависит от android peoject, должен иметь узел apklib, вот так, не забудьте узел упаковки

<modelVersion>4.0.0</modelVersion>
<groupId>cn.company.common</groupId>
<artifactId>util</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>apklib</packaging>
<name>util</name>

второе: это должно понравиться узлу зависимости проекта Android, и не забудьте указать узел типа, не забудьте добавить

<dependency>
<groupId>cn.company.common</groupId>
<artifactId>util</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>apklib</type>
</dependency>
person youshuang    schedule 19.09.2014
comment
Это не отвечает на мой вопрос. Решение Александра М - правильный ответ. - person Sean Barbeau; 19.09.2014