3

我对 OSGi 中的类可见性感到困惑。我正在运行 Apache Felix 并加载以下包:

  • 来自 eclipselink的antlr, asm,jpa和bundlescore
  • javax.persistence1.99的 OSGi-fied jar
  • 带有com.mysql.jdbc驱动程序的 OSGi-fied jar
  • 我自己的一个包,其中包含带注释的实体类和一个persistence.xml
  • 我自己的另一个捆绑包Persistence.createEntityManagerFactory(String, Map)

现在,我很困惑的是哪个包必须能够看到 MySQL 驱动程序。我认为这将是创建 EntityManagerFactory 的包,但是当我在该清单中导入时出现 ClassNotFound 错误。接下来,我尝试从 eclipselinkjpa包的清单中导入它,但又出错了。只有当我从包含持久性单元(实体类和)的包的清单中导入它时persistence.xml,它才能工作。

所以,似乎数据库驱动程序是由类加载器查找 PU 包的,但这对我来说没有意义。这是怎么回事?

我似乎无法为此找到一个简单的文档。这些幻灯片提供了一些提示,但并不十分全面。

4

2 回答 2

3

我熟悉围绕 Hibernate 和 JDBC 的 OSGi 类路径问题,我可以根据您链接到的幻灯片向您解释正在发生的事情。

我假设您已将 JDBC 驱动程序条目添加到persistence.xml您的 PU 包中?

EclipseLink 正在使用扩展器模式代表 PU 包执行工作。扩展程序正在侦听捆绑包,检查它们是否有 persistence.xml,然后进行设置工作。它希望 PU 包导入您可能在 persistence.xml 中引用的所有类型,包括 JDBC 驱动程序。

想想看。EclipseLink 包不会导入所有已知的 JDBC 驱动程序(它不应该)——只有你的包可以知道他们需要哪个数据库驱动程序,所以期望你的 PU 包导入 JDBC 驱动程序类是合理的。

如果它们已经是 OSGi 化的,则不需要修改 3rd 方库的清单,例如 EclipseLink。

于 2009-08-14T13:47:30.727 回答
3

我发现这个 pdf 关于类加载的信息非常丰富:http: //www.martinlippert.org/events/WJAX2008-ClassloadingTypeVisibilityOSGi.pdf

于 2009-08-31T07:21:34.237 回答