【问题标题】:How to publish a database driver as an OSGi bundle如何将数据库驱动程序发布为 OSGi 包
【发布时间】:2018-10-19 14:18:57
【问题描述】:

我有两个或更多非特定的 JDBC 驱动程序。我希望在 OSGi 容器中使用它们。一些驱动程序来自同一个第三方,只有版本差异和一个或多个冲突类,包括驱动程序类和连接 URL。

解释如何从这些包中创建一个 OSGi 包。

我正在使用 JBoss Fuse 6.2.1.redhat-117、Red Hat JBoss Developer Studio 10.4.0.GA(带有 Fuse 集成的 Eclipse)、Maven 3.3.9、Eclipse Maven 集成、Windows 7。

我尝试使用两步过程为每个 JDBC 驱动程序生成我自己的包。

  1. 将驱动程序部署到 Maven 存储库中。
  2. 使用 osgi:install -s wrap:mvn:group/artifact/version 将驱动程序加载到 Fuse。

这还不够好。仅当 JDBC 驱动程序是安装到 OSGi 中的唯一一个冲突驱动程序时,它才能工作。

据我所知,我所描述的问题是 OSGi 旨在解决的问题。因此,我相信有一个解决方案。

我愿意不遗余力地解决这个问题(缺乏硬编码,与通用实施不同),因为到目前为止已支付投资以及解决方案所需的服务。

【问题讨论】:

  • 您必须确保每个驱动程序包都以不同的版本导出其包。

标签: java jdbc osgi jbossfuse fuseesb


【解决方案1】:

在 OSGi 中提供 JDBC 驱动程序的正确方法是实现 the JDBC service。这很容易做到,因为代码几乎完全是通用的。

DataSourceFactory 接口有四种生产方法

  • Driver
  • DataSource
  • ConnectionPoolDataSource
  • XADataSource

如果您的工厂无法提供其中一种或多种类型,则抛出 SQLException 是完全合理的。

然后,您的 DataSourceFactory 实现包应该包装 JDBC 驱动程序 jar(例如,如果它还不是 OSGi 包),或者从 JDBC 驱动程序导入必要的包,以便它可以实现 DataSourceFactory 方法(例如如果驱动程序已经有 OSGi 元数据,但不提供必要的服务)。然后应该将 DataSourceFactory 注册为服务,这可以使用捆绑激活器 (H2 does this) 或使用像声明式服务这样的容器轻松实现。此服务使用服务属性宣传它提供的驱动程序类以及版本和供应商信息。

同一模板项目可用于为同一驱动程序的不同版本生成多个不同的捆绑包,或者通过更改引用的实现。使用诸如 bnd-maven-plugin 之类的工具将确保您的 OSGi 元数据是正确的。

已经有一些项目,例如 PAX-JDBC,试图为 JDBC 驱动程序提供这些类型的包装器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2016-04-20
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多