我一直在开发 OSGi 模块,但到目前为止,当我不得不包装现有的 jar 时,我遇到了很多问题。这方面的一个例子是使用 Oracle 数据库驱动程序,即使我将 jar 打包为包,它也只是拒绝工作(即使存在驱动程序类也找不到)。这只是一个示例,但我在使用其他第 3 方库时遇到了问题,想知道是否有使用每次都有效的第 3 方库的最佳实践方法?
爱
最佳答案
您的问题是 jdbc 使用来自 java 运行时的类来查找数据库驱动程序 (DriverManager.getConnection)。这无法工作,因为无法从系统类加载器(加载 DriverManager 类)访问数据库驱动程序。
在 OSGi 中工作的一种方法是使用 DataSource 代替:http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html .您只需使用 new 创建数据源,这当然有效。问题是它使您的用户包依赖于特定的数据库驱动程序。所以最好的做法是集中创建数据源并将其发布为服务。
您可以在我的 Apache Karaf DB 教程 (http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access) 中找到更多详细信息。
顺便说一句。一般来说,这种工厂通常是 OSGi 中库失败的地方。每个库都发明了另一个不同的工厂系统,其中大部分与 OSGi 的受限类加载器不兼容。幸运的是,如今大多数库都已准备好 OSGi。大多数时候,这仅仅意味着您还可以使用可以使用 OSGi 服务检索的具体对象来调用工厂。
关于java - 第 3 方库的一致 OSGi 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623803/