加载数据库时出现 OSGi ClassNotFoundException Driver

OSGi ClassNotFoundException while loading Database Driver

我知道这是一个常见问题,但创建一个新线程以防有人像我一样卡住,即使在尝试了文档中已经解释的一些选项之后。

我已经部署了一个 osgi 包(比如 Bundle B),其中包含与数据层访问相关的所有代码。基本上,当访问此包中的服务方法时,它仅通过加载 driver 第一次创建 JDBC 连接。 Driver 作为 sqljdbc 4.0 的另一个包装包部署。 (比如捆绑 C)

现在我有了 Bundle TestApp(比如 Bundle A),它从 Bundle B 创建了上述服务方法的实例。所以这里的流程是 Bundle A 代码创建 Bundle B 的导出服务的实例,该实例又访问 Bundle C 的Driver class.

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.access0(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)

这里是个人classloader提出的问题,但是如何克服是我这里的情况。我尝试将 DynamicImport-Package 添加到包 A、B,并尝试创建一个 Fragment 包,如此处所述 https://gist.github.com/rotty3000/1291842 但仍然是相同的异常。继续。

如果有人遇到这样的问题,如果你能给我一个逐步解决这个问题的方法,那将是一个很大的帮助。

提前致谢,祝大家新年快乐。

驱动程序方法在 OSGi 中运行不佳。而是使用数据源。 参见 example at msdn。您可以简单地使用 new 创建一个数据源。这避免了任何类加载问题。

如果您想与实际的数据库提供者分离,那么您可以使用 OSGi jdbc 规范,该规范定义了数据库提供者应该公开一个可以为您创建数据源的 DataSourceFactory。

Pax-jdbc 支持大量数据库提供程序的此规范。它允许有一个 pax-jdbc-config 模块,允许仅使用配置创建一个数据源作为 OSGi 服务。因此,在您的代码中,您只需注入服务即可完成。此外 pax-jdbc-config 还可以处理池化并使 DataSource XA 感知。所以它产生了一个完全生产就绪的数据源。