【问题标题】:"java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy" in EclipseEclipse 中的“java.lang.NoClassDefFoundError:org/hibernate/proxy/HibernateProxy”
【发布时间】:2023-03-17 19:00:01
【问题描述】:

我有一个基于插件的 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”结尾

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

有没有办法在不将 X 和 Y 插件合并到一个插件中的情况下解决这个问题?

【问题讨论】:

  • 我想您希望这两个插件彼此独立工作,对吧?如果是这种情况,您应该确保两个插件可以在没有另一个的情况下运行,即为每个插件独立声明 jar 依赖项。
  • 每个插件的jar依赖是独立的。但是Y插件依赖于X。因为它需要X提供的持久化类。

标签: java eclipse hibernate eclipse-plugin


【解决方案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

【讨论】:

  • 感谢您的建议,但不幸的是,这种方法不适合我的 osgi 模块化。我的意思是,org.hibernate.eclipse 是通用的,不能依赖于我系统中的任何东西。
【解决方案2】:

您的远程部署中缺少 Hibernate 支持库。

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

【讨论】:

    【解决方案3】:

    这样就解决了问题:

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

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

    【讨论】:

      【解决方案4】:

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

      休眠 4.X

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

      的类加载器
      1. 您的实体类
      2. 休眠代理 (org.hibernate.proxy)
      3. Javassist 代理 (javassist.util.proxy)

      休眠 5.X

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

      【讨论】:

        【解决方案5】:

        我在运行 Arquillian 测试时遇到了这个异常。 就我而言,我忘记将 persistence.xml 添加到存档中:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 2015-01-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多