我正在开发一个基于RCP的应用程序,该应用程序使用由hibernate支持的Spring Data JPA实现的数据访问层。带注释的域类在一个jar / bundle中,Spring存储库和用于实例化数据源的Spring配置,实体管理器和事务管理器在另一个bundle中。这些jar用于整个项目中的其他非RCP应用程序。我有所有hibernate 3.6.8 jar和依赖项通过我自己的插件包装和暴露,或者作为目标平台中的OSGI包(jta,antlr,commons集合等)。我正在使用Eclipse Gemini Blueprint来管理RCP应用程序中的bundle spring上下文。
当gemini扩展器初始化DAL bundle spring上下文时,我得到了与Hibernate相关的ClassDefNotFound异常,通常是在org.hibernate.ejb.HibernatePersistence或javax.persistence.spi.Persistenceprovider上。我已经尝试将所有hibernate jar和依赖项放在一个导出javax和hibernate包的插件中。我已经尝试在我控制的插件的清单中设置Eclipse Buddy策略等等。
我无法使用Gemini在Eclipse RCP下找到Spring和Hibernate之间的类加载问题的任何解决方案。通过将所有hibernate jar放在与我的域和DAO类相同的插件中,我已经完成了RCP中的hibernate DAO项目,所以只导出了我的类。
此时我不认为转向更多OSGI友好的JPA提供程序,如OpenJPA或EclipseLink是一种选择。
我找到了一个稍微相关的问题的答案,该问题建议将所有弹簧罐和依赖项放入一个插件中,将hibernate jar和依赖项放在另一个插件中,并设置好友策略。当涉及的大多数罐子都是OSGi包时,这看起来很脏。
我想我可以创建一个包含DAL jar,hibernate jar和spring ORM jar的插件,这样他们就可以看到对方了。
是否有一种干净的方式让它发挥作用?
答案 0 :(得分:0)
核心软件包,如果您拥有它,将所有可疑软件包添加为已注册的伙伴,并确保您已经定义了软件包或捆绑包,否则有时伙计类加载不起作用。如果从你发起加载捆绑,则eclipse伙伴策略应该级联。其他选项是修改导致问题的目标包中的manfiest文件。