一致的OSGi导入第三方库

时间:2013-03-25 20:09:23

标签: java osgi

我一直在开发OSGi模块,但到目前为止,当我不得不包装现有的罐子时,我遇到了很多问题。这方面的一个例子是使用Oracle数据库驱动程序,即使我将jar包装为bundle,也只是拒绝工作(即使它现在也找不到驱动程序类)。这只是一个例子,但我遇到了其他第三方库的问题,并且想知道是否有最佳实践方法来使用每次都有效的第三方库?

Jlove

2 个答案:

答案 0 :(得分:0)

我首选的方法不是包装库,而是解开它,添加一个清单,并重新包装它。 Jars-inside-jars往往会导致难以调试的问题。 Unjar和re-jar可以通过简单的ant脚本自动化。

另外,我喜欢手动编写MANIFEST.MF。如果被包装的库很小,那么这样做很容易。像bnd那样为你生成MANIFEST.MF的工具并不总能给出正确的结果,如果你过分依赖它们,你就不知道幕后发生了什么。

答案 1 :(得分:0)

在您的情况下,问题是jdbc使用java运行时中的类来查找数据库驱动程序(DriverManager.getConnection)。这不起作用,因为无法从系统类加载器(加载DriverManager类)访问数据库驱动程序。

在OSGi中有效的方法是使用DataSource:http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html。在那里,您只需使用new创建数据源,这当然有效。问题是它使您的用户包依赖于特定的DB驱动程序。因此,最佳做法是集中创建DataSource并将其作为服务发布。

您可以在我的Apache Karaf DB教程(http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access)中找到更多详细信息。

顺便说一下。一般来说,这种工厂在OSGi中库存失败的情况下都很复杂。每个lib都会发明另一个不同的工厂系统,而且大多数都与OSGi的受限类加载器不兼容。幸运的是,现在大多数libs都是OSGi。大多数情况下,这只意味着您也可以使用OSGi服务检索的具体对象调用工厂。