質問

Eclipseを使用してOSGiバンドルを開発しています。Eclipse OSGi ランタイム構成を使用してコードをテストします。

そこではコードは正常に動作しますが、バンドルを jar としてエクスポートし、別の環境 (pax-runner など) で使用しようとすると、実行時に ClassNotFound 例外が発生します。バンドルはエラーもなく正常にインストールされています。春分にコマンドを実行します。「diag バンドル番号」と表示すると、次のようになります。すべてのバンドルに「未解決の制約はありません」。

特定の .jar バンドルについて、manifest.mf に記載されていない外部ライブラリが必要かどうかを知るためのツール/方法があるかどうか知りたいです。

役に立ちましたか?

解決

Import-Package(およびRequire-Bundleに記載されているバンドル)に記載されているすべてのパッケージは、実行時に発見された場合あなたのバンドルが解決されます。あなたが解決した後ClassNotFoundExceptionまたはNoClassDefFoundErrorを取得する場合、それはImport-Packageの内容が間違っていたことを意味します。

ピーター・クリエンスするによって無買デーのツールを見てみましょう。この正確な依存関係を発見するためにあなたのクラスからコンパイルされたバイトコードの実行する静的検査、そしてそれはあなたのためのImport-Package文を生成します。動的に名前、例えばによってクラスをロードしない限り、一般的には、あなたが無買デーを使用している場合、あなたはにClassNotFound /がNoClassDefFoundを見ることはないはずですClass.forName()付きます。

他のヒント

私はSpringSourceのbundlorシェルツールを使用して成功を収めてきました。それここを使用するための手順があります。あなたはそのJARから作成したい新しいバンドルの名前とバージョンとともに、それをJARを与えます。その後、JAR内のクラスファイルを解析して、テンプレートのマニフェストを生成することを輸入、それはへの参照を見つけたすべてのパッケージます。

ハードの部分は、オプションである依存関係ワークアウトされ、各パッケージのバージョンに依存します。あなたは、このアウトを理解するためのライブラリなど、Webサイト、リリースノートを読んでする必要があります。

バンドルが実際にどのパッケージをインポートしたり、他のバンドルを必要としない場合は「未解決制約」を取得しません。限りOSGiランタイムに関しては、バンドルが使用可能になります。しかし、すぐに、それはあなたの場合のように、外部クラスにアクセスすると、あなたは恐ろしいClassNotFoundExceptionを取得します。

MANIFEST.MFに記載されていないあなたのコードが使用するクラスの場合は、

のEclipseプラグイン開発環境(PDE)は、あなたのコンパイルエラーを与えるだろう。決意をバンドルし、彼らは動作しません - 実行時ににClassNotFound例外は、多くの場合、間違って、オプションとして、パッケージの輸入をマークすることによって引き起こされます。あなたはに対して実行しているよりも、この種のエラー原因もバンドルまたはパッケージの異なるバージョンに対して可能性がコンパイルます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top