2013-03-25 80 views
2

我一直在开发OSGi模块,但到目前为止,当我必须包装现有的罐子时,我遇到了很多问题。一个例子是使用Oracle数据库驱动程序,尽管我已经将该jar包装为捆绑包,但仍然拒绝工作(即使它存在也找不到该驱动程序类)。这只是一个例子,但我与其他第三方库存在问题,并想知道是否有最佳实践方法来使用第三方库,这些库每次都有效?一致的OSGi导入第三方库

Jlove

回答

0

你的情况的问题是,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)中找到更多的细节。

Btw。一般来说,这类工厂在图书馆OSGi失败的地方是有效的。每个lib创建另一个不同的工厂系统,其中大部分与OSGi的受限类加载器不兼容。幸运的是,现在大部分库都已经做好了OSGi的准备。大多数情况下,这仅仅意味着你也可以用一个可以使用OSGi服务检索的具体对象来调用工厂。

+0

感谢您的信息...我发现它非常有帮助 – JLove 2013-03-27 08:58:19

0

我的首选的方法是不换行库中,但将其unjar,添加一个清单,并重新罐子它。罐子里面的罐子往往会导致难以调试的问题。通过一个简单的ant脚本可以实现unjar和re-jar的自动化。

另外,我喜欢手动编写MANIFEST.MF。如果被封装的库很小,那么很容易做到这一点。像bnd这样的为你生成MANIFEST.MF的工具并不总是给出正确的结果,如果你依赖它们太多,你不知道底下发生了什么。

+0

感谢您的反馈,您能否告诉我该解决方案是否按照上面的示例使用Oracle驱动程序工作?我使用eclipse向导来打包现有的jar文件,该jar文件将jar作为过程的一部分进行提取,因此我不确定它会以不同的结果结束 – JLove 2013-03-25 21:12:39

+0

不确定,我之前在OSGi上下文中使用过Oracle库,没有太多问题。你想发布eclipse生成的MANIFEST.MF吗? – amarillion 2013-03-25 22:06:54

+0

尽管明天会做...。谢谢 – JLove 2013-03-25 22:15:46