我对OSGi中的类可见性感到困惑。我正在运行Apache Felix并加载以下包:
antlr
,asm
,jpa
和core
个捆绑包javax.persistence
1.99 com.mysql.jdbc
驱动程序persistence.xml
Persistence.createEntityManagerFactory(String, Map)
现在,我很困惑的是哪个bundle必须能够看到MySQL驱动程序。我认为这将是创建EntityManagerFactory的包,但是当我在该清单中导入时,我得到了ClassNotFound错误。接下来,我尝试从eclipselink jpa
包的清单中导入它,但又错了。只有当我从包含持久性单元(实体类和persistence.xml
)的包的清单中导入它时,它才有效。
所以,看起来数据库驱动程序是由PU包的clasloader查找的,但这对我来说没有意义。发生了什么事?
我似乎无法为此找到简单的文档。 These slides提供一些提示,但并不完全全面。
答案 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