Eclipse中的“java.lang.NoClassDefFoundError:org / hibernate / proxy / HibernateProxy”

时间:2014-11-26 09:51:40

标签: java eclipse hibernate eclipse-plugin

我有一个基于插件的Eclipse应用程序,我将持久数据放在X插件中,而hibernate-database服务放在Y插件中。

持久化类在X中,HibernateUtil,Dao,所有与hibernate相关的jar和持久化类的hbm.xml映射文件都在Y中。

当我运行应用程序时,我看到很多例外情况:

java.lang.RuntimeException
javassist.CannotCompileException
java.lang.ClassNotFoundException
org.hibernate.HibernateException

所有这些都以“java.lang.NoClassDefFoundError:org / hibernate / proxy / HibernateProxy”结束

如果我在localhost上使用数据库,这些异常不会影响我的应用程序。 但是当我尝试连接到远程数据库时,我的嵌套HQL查询不起作用。我猜这与代理有关。

有没有办法摆脱这个问题而不将X和Y插件合并到一个插件中?

5 个答案:

答案 0 :(得分:1)

问题不是很大程度上是由于eclipse插件的加载机制造成的。有一个解决方案 - 伙伴加载。

在Hibernate插件的MANIFEST.MF文件中(需要加载伙伴),例如org.hibernate.eclipse,添加一行:

Eclipse-BuddyPolicy:registered 

并在插件项目或RCP项目的MANIFEST.MF文件中添加以下行:

Eclipse-RegisterBuddy:org.hibernate.eclipse

这应解决问题。

这是关于此问题的博客文章:

http://hwellmann.blogspot.de/2008/11/hibernate-and-osgi-pragmatic-solution.html

答案 1 :(得分:0)

远程部署中错过了Hibernate支持库。

在WEB-INF下创建一个lib文件夹,并将所有支持的jar文件复制到此lib文件夹。

答案 2 :(得分:0)

这解决了这个问题:

在X插件中, Eclipse-BuddyPolicy:已注册

在Y插件中, Require-Bundle:(x插件ID) Eclipse-RegisterBuddy:(x插件ID)

答案 3 :(得分:0)

从根本上说,这是一个经典OSGi ClassLoader issue.解决方案取决于您使用的Hibernate版本。

Hibernate 4.X

您必须设置ProxyFactory classLoaderProvider以提供包含

的类加载器
  1. 您的实体类
  2. Hibernate Proxy(org.hibernate.proxy)
  3. Javassist proxy(javassist.util.proxy)
  4. Hibernate 5.X

    Hibernate现在使用代理工厂中实体类的类加载器。您必须在包含实体类 {的包的OSGi清单的Import-Package部分中包含Hibernate代理(org.hibernate.proxy)和Javassist(javassist.util.proxy)。 {3}},可能与创建EntityManagerFactory的bundle不同。

答案 4 :(得分:0)

我遇到了运行Arquillian测试的异常。 在我的情况下,我忘了将persistence.xml添加到存档:

archive.addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml");