【问题标题】:Consistent OSGi import of 3rd party libraries3rd 方库的一致 OSGi 导入
【发布时间】:2013-03-15 11:10:03
【问题描述】:

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

爱情

【问题讨论】:

    标签: java osgi


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的反馈,您能否告诉我此解决方案是否可以按照我上面的示例与 Oracle 驱动程序一起使用?我使用 eclipse 向导来包装一个现有的 jar 文件,该文件将 jar 提取为进程的一部分,所以我不确定它会以不同的结果结束
    • 不确定,我之前在 OSGi 上下文中使用过 Oracle 库,没有太多问题。您要发布 Eclipse 生成的 MANIFEST.MF 吗?
    • 会做的……不过现在就是明天。谢谢
    • 你能在 github.com/bndtools/bnd 上将那些 bnd 的“错误结果”报告为错误吗?我有偏见,但我看到手工制作的错误捆绑包比 bnd 制作的包要多得多。尤其是关键用途指令很难手动获得。而且由于 MANIFEST.MF 是一个有效的引导 bnd 文件,我想知道问题出在哪里。当你犯错时,至少 bnd 会告诉你。
    • 我在这里第二次彼得。在大多数情况下,Bnd 开箱即用的效果很好,而在其余情况下,您必须进行一些小的配置调整才能使其正常工作。我将它与 maven bundle 插件一起使用来创建我的包。对于像 DB 驱动程序这样的简单情况,Apache Karaf 提供了一个很好的小功能,称为 wrap 协议。您可以使用 wrap:jar-uri 指定一个包,并且 bnd 会自动应用默认设置。对于 oracle,这已经有效。
    【解决方案2】:

    您的问题是 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 服务检索的具体对象来调用工厂。

    【讨论】:

    • 感谢您提供的信息...我发现它很有帮助
    猜你喜欢
    • 2017-11-02
    • 2018-01-02
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多