Java 第三方库的一致OSGi导入

Java 第三方库的一致OSGi导入,java,osgi,Java,Osgi,我一直在开发OSGi模块,但到目前为止,我在包装现有JAR时遇到了许多问题。这方面的一个例子是使用Oracle数据库驱动程序,尽管我已经将jar打包为bundle,但它拒绝工作(即使存在驱动程序类,也找不到驱动程序类)。这只是一个例子,但我与其他第三方库有过一些问题,我想知道是否有一种最佳实践方法可以使用每次都有效的第三方库 Jlove我首选的方法不是包装库,而是取消对库的归档,添加清单,然后重新包装它。jar中的jar往往会导致难以调试的问题。Unjar和re-jar可以通过一个简单的ant脚

我一直在开发OSGi模块,但到目前为止,我在包装现有JAR时遇到了许多问题。这方面的一个例子是使用Oracle数据库驱动程序,尽管我已经将jar打包为bundle,但它拒绝工作(即使存在驱动程序类,也找不到驱动程序类)。这只是一个例子,但我与其他第三方库有过一些问题,我想知道是否有一种最佳实践方法可以使用每次都有效的第三方库


Jlove

我首选的方法不是包装库,而是取消对库的归档,添加清单,然后重新包装它。jar中的jar往往会导致难以调试的问题。Unjar和re-jar可以通过一个简单的ant脚本实现自动化


另外,我喜欢手动编写MANIFEST.MF。如果要包装的库很小,那么很容易做到这一点。为您生成MANIFEST.MF的工具(如bnd)并不总是给出正确的结果,如果您过于依赖它们,您就不知道幕后发生了什么。

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

在OSGi中工作的一种方法是使用数据源。在这里,您只需使用new创建数据源,这当然有效。问题是它使您的用户包依赖于特定的DB驱动程序。因此,最佳实践是集中创建数据源并将其发布为服务

您可以在我的ApacheKarafDB教程()中找到更多详细信息


顺便说一句,一般来说,这种工厂在OSGi中的库失败的地方很常见。每个lib都发明了另一个不同的工厂系统,其中大多数与OSGi的受限类加载器不兼容。幸运的是,现在大多数LIB都已经为OSGi做好了准备。大多数情况下,这仅仅意味着您还可以使用一个具体的对象来调用工厂,您可以使用OSGi服务检索该对象。

感谢您的反馈,您能告诉我该解决方案是否与我上面的Oracle驱动程序示例一样有效吗?我使用eclipse向导包装一个现有的jar文件,该文件提取jar作为过程的一部分,因此我不确定它是否会以不同的结果结束。不确定,我以前在OSGi上下文中使用过Oracle库,没有太多问题。您想发布eclipse生成的MANIFEST.MF吗?可以。。。不过现在是明天。感谢您在github.com/bndtools/bnd上将这些错误结果报告为错误?我是有偏见的,但我看到的手工制作的错误包比bnd制作的错误包多得多。特别是关键用途指令很难直接获得。由于MANIFEST.MF是要引导的有效bnd文件,我想知道问题出在哪里。当你犯错的时候,至少bnd会告诉你。我在这里支持彼得。Bnd在大多数情况下都是开箱即用的,而在其他情况下,您需要对配置进行一些小的调整才能使其工作。我将它与maven bundle插件一起使用来创建捆绑包。对于DB驱动程序之类的简单情况,ApacheKaraf提供了一个很好的小功能,称为wrap协议。您可以使用wrap:jaruri指定一个bundle,bnd将自动应用到它,并带有默认设置。对于甲骨文来说,这已经起作用了。谢谢你提供的信息。。。我觉得这很有帮助