0

我有一个小问题。我想在 Eclipse rcp 中使用休眠。(我是 osgi 和 eclipse rcp 的新手)。所以我将 jar 添加到 plugin-project 文件夹以及构建路径和包构建路径中,但是当我尝试从我的包中使用休眠时,它会因 ClassNotFoundException 而崩溃。

这样做的正确方法是什么?

4

2 回答 2

0

请查看日食伙伴政策。如果您因类加载而面临未加载的类,这可能会对您有所帮助osgi

于 2012-10-16T17:58:49.010 回答
0

Hibernate 和许多其他经典 Java 程序 (ab) 使用动态类加载来连接不同的部分。他们使用的类是从文件中读取的,然后用 Class.forName 加载。这从根本上说不是模块化的,因为这些类根据定义是实现类,应该隐藏。

由于 OSGi 是一个模块化框架,它在模块(包)周围设置了栅栏,并拒绝加载任何未正确导出和导入的内容。因此,如果 Hibernate 执行其 Class.forName ,它将直接进入这个围栏,因为它应该获得模块化的优势。

Eclipse Buddy 策略就像这道栅栏上的一个大洞,将事物移回糟糕的旧类路径:线性搜索。使用伙伴策略,Eclipse 将开始搜索某处是否存在具有该名称的类。由于这会忽略版本,因此您不能再依赖正确的版本处理。好消息是它在大多数情况下都有效。坏消息是你失去了隐私,当它不起作用时,你会遇到奇怪的错误。

使用 Hibernate,唯一的解决方案是不使用文本文件设置,而是使用 API 并为 Hibernate 提供实际的类。在这些情况下,Hibernate 将使用这些类的类加载器并且有效。在 OSGi 中,只要遵循 Java 语言规则就没有问题。

为了处理类加载黑客解决 OSGi 使用服务的问题。

于 2012-10-17T06:20:52.697 回答