2

私はOSGiモジュールを開発してきましたが、これまでのところ、既存のjarをラップする必要があるときに多くの問題に遭遇しました。この例は、Oracleデータベースドライバーの使用です。これは、jarをバンドルとしてラップしたにもかかわらず、動作を拒否するだけです(ドライバークラスが存在していても見つかりません)。これはほんの一例ですが、他のサードパーティライブラリで問題が発生し、毎回機能するサードパーティライブラリを使用するためのベストプラクティスアプローチがあるかどうか疑問に思っていました。

Jlove

4

2 に答える 2

1

あなたの場合の問題は、jdbcがjavaランタイムのクラスを使用してデータベースドライバー(DriverManager.getConnection)を見つけることです。(DriverManagerクラスをロードした)システムクラスローダーからデータベースドライバーにアクセスできないため、これは機能しません。

OSGiで機能する方法は、代わりにDataSourceを使用することです:http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html。そこで、newを使用してデータソースを作成するだけで、これはもちろん機能します。問題は、ユーザーバンドルが特定のDBドライバーに依存するようになることです。したがって、ベストプラクティスは、データソースを一元的に作成し、サービスとして公開することです。

詳細については、Apache Karaf DBチュートリアル(http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access )を参照してください。 )。

ところで。一般に、この種のファクトリは、OSGiでライブラリが失敗する場所です。すべてのライブラリは別の異なるファクトリシステムを発明し、そのほとんどはOSGiの制限されたクラスローダーと互換性がありません。幸いなことに、ほとんどのライブラリは、最近OSGi対応になっています。ほとんどの場合、これは単に、OSGiサービスを使用して取得できる具体的なオブジェクトを使用してファクトリを呼び出すことができることを意味します。

于 2013-03-26T19:24:21.400 に答える
0

私が好むアプローチは、ライブラリをラップするのではなく、ライブラリを解凍し、マニフェストを追加して、再度jarすることです。Jars-inside-jarsは、デバッグが難しい問題を引き起こす傾向があります。unjarとre-jarは、単純なantスクリプトで自動化できます。

また、MANIFEST.MFを手動で書くのが好きです。ラップされているライブラリが小さい場合は、それを行うのは簡単です。MANIFEST.MFを生成するbndのようなツールは、常に正しい結果をもたらすとは限りません。また、それらに依存しすぎると、内部で何が起こっているのかわかりません。

于 2013-03-25T20:34:51.557 に答える