2012-03-05 4 views
3

私のOSGi環境では、後で使用するためにデータベースドライバをプリロードしようとしています。通常、このようにすることができます:OSGi FelixとBndTools - クラスを名前でロードする

その後、接続を作成することができます。しかし、私がOSGiのFelixでそれを使用すると、クラスが見つかりません(ClassNotFoundException)、接続を作成できません。私はそのような何か(try-catchが省略されている)を行うときしかし:

com.mysql.jdbc.Driver d = new com.mysql.jdbcDriver 
Class.forName("com.mysql.jdbc.Driver"); 

その後、すべてが正常に動作し、接続が作成されます。しかし、ドライバクラスを交換することができないので、これはあまり意味がありません。

最初の方法でクラスを読み込む方法はありますか?私は正しいクラスローダーを提供しなければならないと仮定します。しかし、どこからそれを得るのですか?

MySQLドライバは、OSGiラッパーバンドルとして提供されています。

+0

ソースにクラス名がある場合、Class.forNameでクラス・ダイナミックをロードする必要はありません。ダイナミックなクラスローディングは、ランタイム機構を介してクラス名を取得する場合にのみ使用してください。 –

答えて

4

バンドルマニフェストをどのように正確に作成しますか?ツールを使用してバンドルのOSGiインポート文を自動的に解決すると、単純な文字列をパッケージ依存として認識しないため、最初の方法では失敗します。 2番目の方法は依存関係をハードJavaの依存関係として表しているため、必要なOSGiインポート文を追加するツールで認識されます(OSGiランタイムによってバンドルのクラスパスに追加されます)。

最初の方法を使用するには、バンドルのOSGiインポート文にパッケージcom.mysql.jdbcの依存関係を追加する必要があります。これが達成される方法はツール固有であり、BndはImport-Statement構成パラメータを使用します。

3

@Heriはすべて答えが正しいと言った。ただし、このシステムに柔軟性を導入する場合は、OSGiサービスを使用してください。

データベース接続を行いたいが、コードを特定のデータベースまたはJDBCドライバに強く結合したくない。 javax.sql.DataSourceサービスを公開する小さなJDBCラッパーバンドルを作成してみませんか?ロジックバンドルは、データベースにクエリを実行するときにサービスにバインドされ、物理的なデータベース接続について何も知る必要はありません。

JDBCラッパーバンドルは特定のJDBCドライバーについて知る必要がありますが、非常に細いバンドルであり、使用する可能性のあるドライバーごとに別のラッパーを作成することができます。

関連する問題