【发布时间】:2011-02-02 02:49:30
【问题描述】:
我正在尝试开发一个将成为 launched from a HTTP OSGi service 的 Web 应用程序,该应用程序需要使用其他 OSGi 服务 (db4o OSGi),因为我需要引用 BundleContext。我尝试了两种不同的方法来获取 Web 应用程序中的 OSGi 上下文:
- 将
Activator的BundleContext存储在Web 服务可以导入和使用的类的静态字段中。 - 使用
FrameworkUtil.getBundle(this.getClass()).getBundleContext()(this是MainPage的一个实例,Web 应用程序的一个类)。
我认为第一个选项是完全错误的,但无论如何我都遇到了两个选项中的类加载器的问题。在第二个中,它引发了LinkageError:
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoader) previously initiated loading for a different type with name "com/db4o/ObjectContainer"
也尝试过 Equinox,但我遇到了类似的错误:
java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously initiated loading for a different type with name "com/db4o/ObjectContainer"
引发异常的代码是:
ServiceReference reference = context.getServiceReference(Db4oService.class.getName());
Db4oService service = (Db4oService)context.getService(reference);
database = service.openFile("foo.db");
在最后一行引发了异常,database 类是ObjectContainer,如果我将此变量的类型更改为Object,则不会引发异常,但它作为Object 没有用:)
更新:我尝试使用其他服务而不是 db4o,它们按预期工作。也许 db4o OSGi 包在加载它自己的类时做了一些奇怪的事情,或者我没有正确使用它。如果我从非 Web 包中使用它,它也可以工作。
【问题讨论】:
标签: java osgi classloader db4o