Eclipse RCP、Spring、Hibernate 类加载问题

Posted

技术标签:

【中文标题】Eclipse RCP、Spring、Hibernate 类加载问题【英文标题】:Eclipse RCP, Spring, Hibernate Class Loading Issue 【发布时间】:2012-03-25 07:18:14 【问题描述】:

我正在开发一个基于 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 应用程序中的 bundle spring 上下文。

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢邓肯。我采用了与您描述的方法类似的方法,通过将 Hibernate jars 和依赖项捆绑在一个插件中并使用我的域模型插件和 DAO 插件的伙伴加载来获得一个与 Hibernate 一起工作的 JPA DAO 解决方案,但没有 Spring Data JPA。我不想修改任何第三方清单,因为这不是一个好的维护选项。所以底线是由于类加载器问题,我放弃在 Eclipse RCP 环境中使用 Spring Data JPA。

以上是关于Eclipse RCP、Spring、Hibernate 类加载问题的主要内容,如果未能解决你的问题,请参考以下文章

构建支持 Eclipse 项目的 RCP

Sleak (SWT & RCP) : 设备没有跟踪资源分配 (eclipse 4.3)

我想推荐一本关于 Eclipse 的富客户端平台 (RCP) 的书

Java Eclipse RCP 探查器

如何从 Eclipse RCP 到“主机”Eclipse IDE 进行通信

Eclipse RCP 插件目标平台