3

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

コードはそこで正常に機能しますが、バンドルをjarとしてエクスポートし、別の環境(たとえば、pax-runner)で使用しようとすると、実行時にClassNotFound例外が発生します。バンドルはエラーなしで正常にインストールされます。私はequinoxでコマンド「diagbundle-number」を実行すると、すべてのバンドルに対して「未解決の制約はありません」と表示されます。

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

4

5 に答える 5

2

JBossは、依存関係に関する素晴らしいオープンソース診断ツールをリリースしました:http://jboss.org/tattletale

機能の1つは、イントロスペクションによってjarファイルを分析し、不足しているすべての依存関係を見つけることです。

于 2010-08-31T14:35:28.643 に答える
2

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

PeterKriensによるBndツールを見てください。これにより、クラスからコンパイルされたバイトコードの静的検査が実行され、正確な依存関係が検出され、Import-Packageステートメントが生成されます。一般に、Bndを使用する場合、名前でクラスを動的にロードしない限り、ClassNotFound/NoClassDefFoundは表示されませんClass.forName()

于 2010-09-02T23:58:56.067 に答える
1

私はしばらく前にこのようなことをしました(IKVMを介してJavaを.NETにクロスコンパイルしていましたが、Jar間の依存関係が必要でした)JarAnalyzerを使用して依存関係のグラフを作成しました。

于 2010-08-31T14:34:10.063 に答える
1

SpringSourceのバンドルシェルツールで成功しました。ここにそれを使用するための指示があります。そのJARから作成する新しいバンドルの名前とバージョンとともに、JARを指定します。次に、JAR内のクラスファイルを分析し、参照先のパッケージをインポートするテンプレートマニフェストを生成します。

次に難しいのは、どの依存関係がオプションであり、各パッケージのどのバージョンに依存するかを決定することです。ライブラリがこれを理解するには、Webサイトやリリースノートなどを読む必要があります。

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

于 2010-09-03T22:16:30.343 に答える
0

コードでMANIFEST.MFにリストされていないクラスが使用されている場合、Eclipseプラグイン開発環境(PDE)でコンパイルエラーが発生します。実行時のClassNotFound例外は、パッケージのインポートをオプションとして誤ってマークすることによって引き起こされることがよくあります。バンドルは解決されますが、機能しません。実行しているものとは異なるバージョンのバンドルまたはパッケージに対してコンパイルすると、この種のエラーが発生する可能性もあります。

于 2012-05-22T14:23:28.173 に答える