在OSGi环境中,类路径和类加载器是如何设置的?

时间:2009-08-13 13:50:04

标签: jpa osgi classloader eclipselink apache-felix

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

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

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

所以,看起来数据库驱动程序是由PU包的clasloader查找的,但这对我来说没有意义。发生了什么事?

我似乎无法为此找到简单的文档。 These slides提供一些提示,但并不完全全面。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

如果第三方库已经是OSGi-ified,则不需要修改它们的清单,例如EclipseLink。

答案 1 :(得分:3)

我发现这个pdf在类加载方面非常有用: http://www.martinlippert.org/events/WJAX2008-ClassloadingTypeVisibilityOSGi.pdf