アーティファクトがMavenを介して管理されるAndroidライブラリ(SiriRestClient)を開発しており、開発にEclipseを使用しています。プロジェクトにアセットがなく、Javaクラスのみがあり、Eclipse / Maven / ADTでアーティファクトをapklibsとしてパッケージ化する際に問題があるため、アーティファクトをJARファイルとしてパッケージ化しています。
また、SiriRestClientライブラリに依存するAndroidユーザーインターフェイスアプリケーション(SiriRestClientUI )も開発しています。Mavenを介してSiriRestClientライブラリへの依存関係を管理しています。
Eclipseでは、プロジェクトのビルドとデプロイの両方が独立して正常に行われます。
問題:
Mavenを介してSiriRestClientライブラリへのSiriRestClientUI依存関係の管理を開始したので、ライブラリプロジェクトと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の依存関係をどのように処理しているかに起因すると思います。
これは、ライブラリプロジェクト(その上のSiriRestClient)が閉じているときのSiriRestClientUIプロジェクトを示すEclipseのスクリーンショットです。
sirirestclient-1.0.0-SNAPSHOT.jar
「MavenDepedencies」の下にあるファイルは、私のローカルMavenリポジトリから取得されています。これは私が欲しいものです。この構成では、すべてが正常に機能します。
ただし、SiriRestClientライブラリプロジェクトを開くと、「Maven Depedencies」エントリが変更され、JARファイルが消え、代わりにプロジェクトのフォルダが表示されます。
両方のプロジェクトが開いているときにSiriRestClientUIを起動しようとすると、が表示されますNoClassDefFoundError
。したがって、Eclipseがプロジェクトビルドをリダイレクトしており、ライブラリクラスが含まれていないようです。
質問:
Mavenの依存関係をローカルプロジェクトに切り替えるのではなく、ローカルのMavenリポジトリ内のJARファイルに常に依存するようにEclipse / Mavenを構成するにはどうすればよいですか?
NoClassDefFoundError
または、この構成でを取り除く別の方法はありますか?
ライブラリプロジェクトのpom.xmlファイルはここにあります。
SiriRestClientUIアプリプロジェクトのpom.xmlファイルはこちらです。