我有一个 OSGi 项目,其中包含一个带有 JPA 注释域模型的包和另一个使用 Eclipselink 作为持久性提供程序的包。后者实例化EntityManager
使用配置参数来确定 JDBC 驱动程序的类名。
现在,包含模型的捆绑包需要能够看到 JDBC 驱动程序,我认为这是因为 eclipselink 使用模型类的类加载器来加载它。这有一个不需要的副作用,我需要Import-Package
在模型的包中明确声明一个指令来拉入驱动程序。然后通过 OSGi 交换驱动程序不再容易(我需要重新生成清单),这首先违背了使用 OSGi 的目的。
由于 JDBC 驱动程序都实现了相同的接口,我想做的是将数据库驱动程序放在它们自己的包中,将它们注册到 OSGi 容器中的通用接口名称下,并让 eclipselink 使用任何可用的东西。但我看不到如何做到这一点,因为似乎驱动程序是由 eclipselink 实例化的,这意味着我不能在其他地方实例化它并且让 eclipselink 忘记实际的类名。
这似乎是一件非常典型的事情。我想那里已经有解决方案了?
今年早些时候 Oracle 的 Shaun Smith 的这篇文章表明可能没有,但它也表明对它的需求似乎是相当真实的。