これは一般的な問題ですが、すでにドキュメントで説明されているオプションのいくつかを試しても、私のようなものがあっても新しいスレッドを作成します。データベースドライバのロード中に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のようにフラグメントバンドルを作成しようとしましたが、同じ例外があります。続行します。
誰かがこのような問題に遭遇した場合、この問題を解決するためのステップバイステップアプローチを教えていただければ幸いです。
ありがとうございました。
あなたのバンドルにはどのようなコードがありますか(関連する行のみを表示しています)。例外が発生した時点で何が行われますか? –
バンドルAから、PremiumServiceサービス= new PremiumServiceImpl(); Bundle B PremiumServiceImpl、dao.getJdbcConnection()は、Class.forName()、Bundle C、sqljdbc4-4.jarをラップされたバンドルとして呼び出します。 –
この行のアプリケーションをデバッグすると、Class.forName(driverClassName)クラスローダーは、バンドルAの名前としてバンドルされたバンドルクラスローダーであり、このコード行はバンドルB(DataServices)プロジェクトにあります。ドライバクラス名の値も正しいと確認されました。 –