少し問題が発生しました。eclipse rcp で hibernate を使用したい。(私はosgiとeclipse rcpが初めてです)。そのため、プラグイン プロジェクト フォルダー、ビルド パス、およびバンドル ビルド パスに jar を追加しましたが、バンドルから休止状態を使用しようとすると、ClassNotFoundException でクラッシュします。
これを行う適切な方法は何ですか?
Pls は日食バディ ポリシーを見てください。これは、クラスローディングが原因でクラスがロードされないことに直面している場合に役立ちますosgi
。
Hibernate やその他の多くの古典的な Java プログラムは (ab) 動的クラス ローディングを使用して、さまざまな部分を接続します。使用するクラスはファイルから読み取られ、Class.forName でロードされます。これらのクラスは定義により実装クラスであり、非表示にする必要があるため、これは基本的にモジュール化されていません。
OSGi はモジュール性フレームワークであるため、モジュール (バンドル) をフェンスで囲み、適切にエクスポートおよびインポートされていないものをロードすることを拒否します。したがって、Hibernate が Class.forName を実行すると、モジュール性の利点を得るために、このフェンスにぶつかります。
Eclipse Buddy ポリシーは、このフェンスの巨大な穴のようなものであり、物事を古い古いクラスパスである線形検索に戻します。バディ ポリシーを使用すると、Eclipse はその名前を持つクラスがどこかにある場合に検索を開始します。これはバージョンを無視するため、適切なバージョン処理に頼ることができなくなります。良いニュースは、ほとんどの場合に機能することです。悪いニュースは、プライバシーが失われ、機能しない場合に奇妙なエラーが発生することです.
Hibernate では、唯一の解決策は、テキスト ファイルのセットアップを使用するのではなく、API を使用して Hibernate に実際のクラスを与えることです。そのような場合、Hibernate はそれらのクラスのクラス ローダーを使用し、それが機能します。OSGi では、Java 言語の規則に従っていれば問題ありません。
クラス・ローディング・ハックが対処するような問題を処理するために、OSGi はサービスを使用します。