追加したユーザーは T.Yamamoto です。最後に編集したユーザーは T.Yamamotoで、その日時は 2009-12-23 20:07:29 です。
よくある誤り
実行時例外の診断は、OSGiの初心者、経験者を問わずイライラさせられる経験になることがあります。ここでは、これらのコード例を実行するときに経験するかもしれない、よくある誤りとその解決法を示します:
ClassNotFoundException - JavaとGroovyのコンパイラは依存関係を解決するためにクラスパスを使いますが、OSGiコンテナは使いません。これは、問題なくコンパイルできるコードでも、コンテナで実行するときにはClassNotFoundExceptionを受ける可能性があることを意味しています。以下に、この問題を診断するためのいくつかのステップを示します:
- 例外のスタックトレースを読み、どのクラスが見つからないかを調べる
- そのクラスはどのJarに含まれているのかを調べる
- そのJarのManifestには、問題のクラスが属するパッケージのためのExport-Package文が含まれているか?もし含まれていなければそのJarは正しく作られていないので、JarのExport-Package文にそのパッケージを追加する必要がある。
- あなたのJarのManifestには、インポートしているパッケージのためのImport-Package文が含まれているか?もし含まれていなければそのJarは正しく作られていないので、JarのImport-Package文に該当するパッケージを追加する必要がある。
- Export-Packageのバージョン番号はImport-Packageのバージョン番号とマッチしているか?もし異なるなら、manifestを修正して正しいバージョンをインポートするか、
見つからないクラスを含んだjarの方を修正して正しいバージョンをエクスポートする。
- 見つからないクラスを含んだバンドルは、コンテナに正しくインストールされ、起動されているか?"ss"コマンドの結果が、そのJarが"Active"であることを示していないのなら、この依存関係は解決できない。"install"と"start"コマンドを使って、そのjarを正しく起動しよう。
Missing Constraint - これはコンテナが、あなたが宣言したImport-Package文の一つを満たせないことを意味します。具体的にどの依存関係が満たせないかはエラーメッセージでわかります。例えば、こんな感じです: Missing Constraint groovy.lang; version="1.7.0.beta-1-SNAPSHOT".
- 見つからない依存対象を含んだバンドルは、コンテナに正しくインストールされ、起動されているか?"ss"コマンドの結果が、そのJarが"Active"であることを示していないのなら、この依存関係は解決できない。"install"と"start"コマンドを使って、そのjarを正しく起動しよう。
ClassCastException - このエラーは、BundleContextからサービスを取得するときに、謎めいたエラーメッセージ"Cannot cast foo.bar.Class to foo.bar.Class"という形をとって発生します。これは、あなたのバンドルのClassLoaderが、取得しようとしているものとは異なるバージョンのfoo.bar.Classをすでに持っていることを意味します。
- サービスのActivatorが、foo.bar.ClassをどのようにBundleContextに追加しているか確認する。そのクラスがGroovyで実装されている場合には、この文書の「Groovyで書いたサービスを公開する」で説明したClassLoaderのコードを使ってサービスを追加しなければならない。
- あなたのActivatorが、そのクラスへの参照をどのように解決しているかを確認する。もしあなたのバンドルがすでにfoo.bar.Classを定義していて、別のバンドルからfoo.bar.Classを取得しようとしている場合、それら二つのクラスのバージョンはマッチしない。この問題を解決するためには、その型を、両方のバンドル間で同じようにインポートされるインタフェースとして宣言しよう。