質問
Eclipseを使用してOSGiバンドルを開発しています。Eclipse OSGi ランタイム構成を使用してコードをテストします。
そこではコードは正常に動作しますが、バンドルを jar としてエクスポートし、別の環境 (pax-runner など) で使用しようとすると、実行時に ClassNotFound 例外が発生します。バンドルはエラーもなく正常にインストールされています。春分にコマンドを実行します。「diag バンドル番号」と表示すると、次のようになります。すべてのバンドルに「未解決の制約はありません」。
特定の .jar バンドルについて、manifest.mf に記載されていない外部ライブラリが必要かどうかを知るためのツール/方法があるかどうか知りたいです。
解決
Import-Package
(およびRequire-Bundle
に記載されているバンドル)に記載されているすべてのパッケージは、実行時に発見された場合あなたのバンドルが解決されます。あなたが解決した後ClassNotFoundException
またはNoClassDefFoundError
を取得する場合、それはImport-Package
の内容が間違っていたことを意味します。
他のヒント
特徴の一つは、すべての欠けている依存関係を見つけるために、イントロスペクションによってjarファイルを分析することである。
私はしばらく前にこのようなことを行ったことがあります(IKVM経由でJavaを.NETにクロスコンパイルしていましたが、Jar間の依存関係が必要でした)。 JarAnalyzer 依存関係のグラフを作成します。
私はSpringSourceのbundlorシェルツールを使用して成功を収めてきました。それここを使用するための手順があります。あなたはそのJARから作成したい新しいバンドルの名前とバージョンとともに、それをJARを与えます。その後、JAR内のクラスファイルを解析して、テンプレートのマニフェストを生成することを輸入、それはへの参照を見つけたすべてのパッケージます。
ハードの部分は、オプションである依存関係ワークアウトされ、各パッケージのバージョンに依存します。あなたは、このアウトを理解するためのライブラリなど、Webサイト、リリースノートを読んでする必要があります。
バンドルが実際にどのパッケージをインポートしたり、他のバンドルを必要としない場合は「未解決制約」を取得しません。限りOSGiランタイムに関しては、バンドルが使用可能になります。しかし、すぐに、それはあなたの場合のように、外部クラスにアクセスすると、あなたは恐ろしいClassNotFoundException
を取得します。
のEclipseプラグイン開発環境(PDE)は、あなたのコンパイルエラーを与えるだろう。決意をバンドルし、彼らは動作しません - 実行時ににClassNotFound例外は、多くの場合、間違って、オプションとして、パッケージの輸入をマークすることによって引き起こされます。あなたはに対して実行しているよりも、この種のエラー原因もバンドルまたはパッケージの異なるバージョンに対して可能性がコンパイルます。