如何将数据库驱动程序发布为OSGi包

时间:2018-05-09 12:46:08

标签: java jdbc osgi jbossfuse fuseesb

我有两个或更多非特定的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中。
  3. 这不能很好地运作。仅当JDBC驱动程序是安装在OSGi中的唯一一个冲突驱动程序时,它才有效。

    我能说的最好,我所描述的问题是OSGi创建的问题。因此我相信有一个解决方案。

    我愿意竭尽全力解决这个问题(缺乏硬编码,与通用实施不同),因为迄今为止付出的投资以及解决方案所需的服务。

1 个答案:

答案 0 :(得分:5)

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

DataSourceFactory接口有四种生成

的方法
  • Driver
  • DataSource
  • ConnectionPoolDataSource
  • XADataSource

如果您的工厂无法提供这些类型中的一种或多种,​​那么抛出SQLException是完全合理的。

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

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

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