2017-01-16 15 views
0

これは一般的な問題ですが、すでにドキュメントで説明されているオプションのいくつかを試しても、私のようなものがあっても新しいスレッドを作成します。データベースドライバのロード中にOSGi ClassNotFoundExceptionが発生する

データ層アクセスに関連するすべてのコードを持つosgiバンドル(Say Bundle B)を導入しました。基本的には、このバンドルのサービスメソッドにアクセスすると、ドライバをロードすることによって初めてJDBC接続が作成されます。ドライバは、sqljdbc 4.0の別のラップされたバンドルとして展開されます。 (Say Bundle C)

ここでは、Bundle Bのサービスメソッドをインスタンス化するBundle TestApp(Say Bundle A)があります。ここでのフローは、Bundle Bのエクスポートサービスのインスタンスを作成します。バンドルCのDriverクラスにアクセスします。

Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver not found by DataServices [417] 
     at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556) 
     at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77) 
     at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:264) 

個々のクラスローダーがここで問題を作りますが、克服する方法は私にとってここの状況です。私はDynamicImport-PackageをバンドルA、Bに追加しようとしましたが、ここではhttps://gist.github.com/rotty3000/1291842のようにフラグメントバンドルを作成しようとしましたが、同じ例外があります。続行します。

誰かがこのような問題に遭遇した場合、この問題を解決するためのステップバイステップアプローチを教えていただければ幸いです。

ありがとうございました。

+0

あなたのバンドルにはどのようなコードがありますか(関連する行のみを表示しています)。例外が発生した時点で何が行われますか? –

+0

バンドルAか​​ら、PremiumServiceサービス= new PremiumServiceImpl(); Bundle B PremiumServiceImpl、dao.getJdbcConnection()は、Class.forName()、Bundle C、sqljdbc4-4.jarをラップされたバンドルとして呼び出します。 –

+0

この行のアプリケーションをデバッグすると、Class.forName(driverClassName)クラスローダーは、バンドルAの名前としてバンドルされたバンドルクラスローダーであり、このコード行はバンドルB(DataServices)プロジェクトにあります。ドライバクラス名の値も正しいと確認されました。 –

答えて

1

ドライバアプローチはOSGiではうまく機能しません。代わりに、DataSourceを使用します。 example at msdnを参照してください。新しいデータソースを作成するだけで簡単にデータソースを作成できます。これにより、クラスローディングの問題が回避されます。

実際のDBプロバイダから切り離したい場合は、dbプロバイダがDataSourceを作成できるDataSourceFactoryを公開するように定義するOSGi jdbc仕様を使用できます。

Pax-jdbcは、広範囲のdbプロバイダに対してこの仕様をサポートしています。それは、ただconfigを使用してOSGiサービスとしてDataSourceを作成することを可能にするpax-jdbc-configモジュールを持っています。だからコードでは、サービスを注入するだけで済みます。さらに、pax-jdbc-configはプールし、DataSource XAに認識させることができます。そのため、完全な生産準備が整ったDataSourceが生成されます。

+0

クリスチャンありがとう、このオプションを試してみましょう。 –

+0

Pax-jdbc、私は広範囲のDBサポートを見ていますが、SQLServerを見ることはできません。これはGeneric Driver Extenderと一緒に行く必要があるのでしょうか? –

+0

mssqlモジュールがあります。 https://github.com/ops4j/org.ops4j.pax.jdbc/tree/master/pax-jdbc-mssql。それは0.6.0以来のリリースの一部です –

関連する問題