3

我正在开发一个基于 RCP 的应用程序,该应用程序使用由 hibernate 支持的 Spring Data JPA 实现的数据访问层。带注释的域类位于一个 jar/bundle 中,用于实例化数据源、实体管理器和事务管理器的 Spring 存储库和 spring 配置位于另一个 bundle 中。这些 jar 被项目中的其他非 RCP 应用程序使用。我拥有所有hibernate 3.6.8 jars 和依赖项通过我自己的插件或作为目标平台中的 OSGI 包(jta、antlr、commons 集合等)包装和公开。我正在使用 Eclipse Gemini Blueprint 来管理 RCP 应用程序中的捆绑弹簧上下文。

当 Gemini 扩展程序初始化 DAL 包 spring 上下文时,我得到与 Hibernate 相关的 ClassDefNotFound 异常,通常在 org.hibernate.ejb.HibernatePersistence 或 javax.persistence.spi.Persistenceprovider 上。我尝试将所有 hibernate jar 和依赖项放在一个导出 javax 和 hibernate 包的插件中。我已经尝试在我可以控制的插件的清单中设置 Eclipse Buddy 策略等。

在使用 Gemini 的 Eclipse RCP 下,我无法找到 Spring 和 Hibernate 之间此类加载问题的任何解决方案。通过将所有休眠 jar 放在与我的域和 DAO 类相同的插件中,我已经完成了 RCP 中的休眠 DAO 项目,因此只有我的类被导出。

在这一点上,我不认为转向像 OpenJPA 或 EclipseLink 这样对 OSGI 更友好的 JPA 提供程序是一种选择。

我找到了一个稍微相关的问题的答案,该问题建议将所有 spring jars 和依赖项放入一个插件中,将 hibernate jars 和依赖项放在另一个插件中并设置好友策略。当涉及的大多数 jar 都是 OSGi 包时,这似乎很脏。

我想我可以创建一个插件来保存 DAL jar、hibernate jar 和 spring ORM jar,这样它们就可以互相看到。

有没有一种干净的方法可以让它工作?

4

1 回答 1

0

如果您拥有核心捆绑包,请将所有可疑捆绑包添加为注册伙伴,并确保您已定义包或捆绑包,否则有时伙伴类加载将无法正常工作。如果加载是从您捆绑启动的,则 Eclipse 伙伴策略应该级联。其他选项是修改导致问题的目标包中的 manfiest 文件。

于 2012-03-29T01:45:42.890 回答