Я разрабатываю библиотеку 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 находится здесь а>.