我有两个或更多非特定的 JDBC 驱动程序。我希望在 OSGi 容器中使用它们。一些驱动程序来自同一第三方,只有版本差异和一个或多个冲突类,包括驱动程序类和连接 URL。
解释如何从这些包中的每一个创建一个 OSGi 包。
我正在使用 JBoss Fuse 6.2.1.redhat-117、Red Hat JBoss Developer Studio 10.4.0.GA(Eclipse 与 Fuse 集成)、Maven 3.3.9、Eclipse Maven 集成、Windows 7。
我尝试使用两步过程为每个 JDBC 驱动程序生成我自己的包。
- 将驱动程序部署到 Maven 存储库中。
- 使用 osgi:install -s wrap:mvn:group/artifact/version 将驱动程序加载到 Fuse。
这还不够好。只有当 JDBC 驱动程序是安装到 OSGi 中的唯一一个冲突驱动程序时,它才能工作。
据我所知,我所描述的问题是创建 OSGi 来解决的问题。因此,我相信有一个解决方案。
我愿意竭尽全力解决这个问题(缺乏硬编码,与通用实现不同),因为迄今为止已支付的投资以及解决方案所需的服务。
最佳答案
使 JDBC 驱动程序在 OSGi 中可用的正确方法是实现 the JDBC service .这很容易做到,因为代码几乎完全是通用的。
DataSourceFactory接口(interface)有四种生产方法
驱动程序
数据源
ConnectionPoolDataSource
XADataSource
如果您的工厂不能提供这些类型中的一种或多种,则抛出 SQLException
是完全合理的。
然后,您的 DataSourceFactory 实现包应该包装 JDBC 驱动程序 jar(例如,如果它还不是 OSGi 包),或者从 JDBC 驱动程序导入必要的包,以便它可以实现 DataSourceFactory 方法(例如如果驱动程序已经有 OSGi 元数据,但不提供必要的服务)。然后应该将 DataSourceFactory 注册为服务,这可以使用捆绑激活器 (H2 does this) 或使用声明式服务等容器轻松实现。此服务使用服务属性公布它提供的驱动程序类以及版本和供应商信息。
同一个模板项目可用于为同一个驱动程序的不同版本生成多个不同的包,或者通过更改引用的实现。使用诸如 bnd-maven-plugin 之类的工具将确保您的 OSGi 元数据是正确的。
已经有一些项目,比如PAX-JDBC试图为 JDBC 驱动程序提供这些类型的包装器。
关于java - 如何将数据库驱动程序发布为 OSGi 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50253790/