我知道这是一个常见的问题,但是如果有人在尝试了一些已经在文档中解释过的选项之后就会像我一样陷入困境,那么就创建一个新线程。
我已经部署了一个osgi包(Say Bundle B),其中包含与数据层访问相关的所有代码。基本上,当访问此捆绑包中的服务方法时,它仅通过加载驱动程序第一次创建JDBC连接。驱动程序部署为另一个包装的sqljdbc 4.0包。 (说捆绑C)
现在我有Bundle TestApp(Say Bundle A),它从Bundle B创建一个上述服务方法的实例。所以这里的流程是Bundle A代码创建Bundle B导出服务的实例,然后访问Bundle 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,尝试创建一个Fragment捆绑包,如此处https://gist.github.com/rotty3000/1291842,但仍然是相同的异常。继续。
如果有人遇到过这样的问题,如果你能够一步一步地解决这个问题,那将是一个很大的帮助。
提前感谢您,祝大家新年快乐。
答案 0 :(得分:1)
在OSGi中,驱动程序方法效果不佳。而是使用DataSource。 见example at msdn。您只需使用new创建数据源即可。这可以避免任何类加载问题。
如果要与实际的数据库提供程序分离,则可以使用OSGi jdbc规范,该规范定义数据库提供程序应公开可为您创建数据源的DataSourceFactory。
Pax-jdbc支持大范围数据库提供程序的此规范。它允许有一个pax-jdbc-config模块,允许仅使用配置创建一个DataSource作为OSGi服务。因此,在您的代码中,您可以注入服务并完成。另外,pax-jdbc-config还可以处理池并使DataSource XA识别。因此,它可以生成完全生产就绪的DataSource。