我一直在开发 OSGi 模块,但到目前为止,当我不得不包装现有的 jar 时遇到了许多问题。这方面的一个例子是使用 Oracle 数据库驱动程序,即使我已将 jar 包装为捆绑包,它也只是拒绝工作(即使存在驱动程序类也找不到)。这只是一个示例,但我在使用其他 3rd 方库时遇到了问题,并且想知道是否有使用 3rd 方库的最佳实践方法每次都有效?
杰洛夫
您的问题是 jdbc 使用 java 运行时中的一个类来查找数据库驱动程序(DriverManager.getConnection)。这不起作用,因为无法从系统类加载器(加载 DriverManager 类)访问数据库驱动程序。
在 OSGi 中工作的一种方法是改用 DataSource: http: //docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html。在那里,您只需使用 new 创建数据源,这当然可以。问题是它使您的用户捆绑包依赖于特定的数据库驱动程序。所以最佳实践是集中创建 DataSource 并将其作为服务发布。
您可以在我的 Apache Karaf DB 教程中找到更多详细信息(http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access)。
顺便提一句。一般来说,这种工厂通常是库在 OSGi 中失败的地方。每个库都发明了另一个不同的工厂系统,其中大多数与 OSGi 的受限类加载器不兼容。幸运的是,如今大多数库都已为 OSGi 做好了准备。大多数情况下,这仅仅意味着您还可以使用可以使用 OSGi 服务检索的具体对象来调用工厂。
我首选的方法不是包装库,而是解压缩它,添加清单,然后重新压缩它。Jars-inside-jars 往往会导致难以调试的问题。Unjar 和 re-jar 可以通过一个简单的 ant 脚本自动化。
另外,我喜欢手动编写 MANIFEST.MF。如果被包装的库很小,那么很容易做到这一点。像 bnd 这样为您生成 MANIFEST.MF 的工具并不总能提供正确的结果,如果您过于依赖它们,您将不知道幕后发生了什么。